Crea una cuenta o inicia sesi贸n

隆Contin煤a aprendiendo sin ning煤n costo! 脷nete y comienza a potenciar tu carrera

Parseando HTML con BeautifulSoup

5/30
Recursos

Aportes 41

Preguntas 17

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Si a alguien le sale ouldn鈥檛 find a tree builder with the features you requested: lxml.
Pueden probar con:

s = BeautifulSoup(p12.text, 'html.parser')

este es el c贸digo que us茅 para extraer la lista

s.find('ul',attrs={'class':'horizontal-list main-sections hide-on-dropdown'}).find_all('li')

Si alguien se le presenta el error:

"Couldn't find a tree builder with the features you requested: %s. Do you need to install a parser library?"

Anaconda Navigator

Debes instalar el m贸dulo de lxml. Lo puedes hacer instal谩ndolo desde Anaconda Navigator o directamente a la versi贸n de Python Environment que esta ejecutando jupyter.

Si es el entorno base (root):

~/anaconda3/bin/pip install lxml

Si es un determinado entorno.

~/anaconda3/envs/<environment_name>/bin/pip install lxml

Una forma abreviada de usar el metodo find_all() es buscar con un parentesis despues de un objeto BeautifulSoup o Tag

Ejemplo

soup.find_all("a")
soup("a")

Otras maneras de expresar lo mismo

soup_p12.find(class_='hot-sections')('a')
soup_p12.find(class_='hot-sections').a
soup_p12.find(class_='hot-sections').find_all('a')

Por si se preguntan c贸mo hace los atajos en Jupyter e profesor, ac谩 les comparto un enlace:
https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/

La expresi贸n:

s .find('ul', attrs={'class':'hot-sections'}).find_all('li')

puede acortarse a simplemente esto:

s.find('ul', 'hot-sections').find_all('a')

y funciona de la misma manera.

No se si Anaconda trae por defecto el parser 鈥榣xml鈥, en caso de que les salga este error 鈥淐ouldn鈥檛 find a tree builder with the features you鈥 para los que solo instalaron Jupyter y las librer铆as mediante pip deben instalar la parser library de 鈥榣xml鈥 con el siguiente comando:

pip install lxml

Actualizado tag y class:

s.find('ul', attrs = {'class': 'horizontal-list main-sections hide-on-dropdown'})

Importante

Al crear un objeto de tipo beautifulsoup (o de cualquier otra biblioteca, librer铆a, etc.) tenemos acceso a las funciones que contiene la biblioteca que importamos. 驴D贸nde podemos encontrar todas estas funciones? en la documentaci贸n.

Imag铆nenlo como una caja de herramientas para algo en concreto. Es como decir me voy a traer mi caja de herramientas especial para cortar madera. Y dentro tenemos las herramientas especializadas para esta tarea

Agrego esta info porque me parece que esto no est谩 muy claro para muchas personas que est谩n empezando y creo que puede llegar a ser de ayuda para m谩s de uno.

Este es el c贸digo actual al 26 de enero de 2021:

s.find('ul', attrs={'class': 'horizontal-list main-sections hide-on-dropdown'}).find_all('li')

Beautiful Soup es una librer铆a Python que permite extraer informaci贸n de contenido en formato HTML o XML. Para usarla, es necesario especificar un parser, que es responsable de transformar un documento HTML o XML en un 谩rbol complejo de objetos Python. Esto permite, por ejemplo, que podamos interactuar con los elementos de una p谩gina web como si estuvi茅semos utilizando las herramientas del desarrollador de un navegador.

!(

La p谩gina cambi贸 un poco desde la versi贸n de la clase a hoy que hago el comentario:

Les comparto la ligera modificaci贸n de la secci贸n en la que se encuentran las categor铆as:

s.find('ul', attrs={'class':'horizontal-list main-sections hide-on-dropdown'}).find_all('li')

En mi caso us茅 Xpath para exrtaer los links con el siguiente c贸digo:

$x('//ul[@class="hot-sections"]/li/a/@href')

Lo ejecutan en la consola de su navegador favorito y obtendr谩n los enlaces de cada secci贸n.

Importamos la libreria

from bs4 import BeautifulSoup

Parser separa el texto largo en pedazos mas peque帽os y mas f谩cil de identificar

s = BeautifulSoup(p12.text, 'lxml')
s = BeautifulSoup(p12.text, 'html.parser')

print (s.prettify())

#extraemos la clase
s.find('ul', attrs={'class':'main-sections'})

#especificamos todos los li
s.find('ul', attrs={'class':'main-sections'}).find_all('li')

#extraemos la etiqueta a
s.find('ul', 'main-sections').find_all('a')

Que buen curso!!!

Hubiera sido m谩s completo con una p谩gina que requiera LOGIN y en ambos ejemplos uno con request y el otro con Selenium.

Actualmente la p谩gina ha cambiado su clase, hasta el 12/07/2021 el siguiente c贸digo es el que funciona

 s.find('ul', attrs={'class': 'horizontal-list main-sections hide-on-dropdown'})

s.find(鈥榰l鈥, attrs={鈥榗lass鈥:鈥榤ain-sections鈥檥)

Actualizando en el 2021 la url : https://www.pagina12.com.ar/secciones/el-pais

F12 para los que no sepan c贸mo obtener el inspector de elementos

El an谩lisis de c贸digo HTML es un skill importante que todo desarrollador o programador debe dominar, para analizar HTML con Python podemos usar:

  1. El m贸dulo html.parse que define la clase HTMLParser la cual sirve de base para el an谩lisis de archivos de texto con formato en HTML y XHTML

2.Analizar HTML con la librer铆a BeautifulSoup

En la configuraci贸n de la consola, pueden colocar el tema Dark para que no se les quemen los ojos

A mi me funcion贸 el siguiente comando teniendo en cuenta el cambio en el dise帽o de la p谩gina web

print(s.find('ul', attrs={'class':'horizontal-list main-sections hide-on-dropdown'}).find_all('a'))

Espero les sea 煤til

Wow

Esta es otra manera de hacerlo.

s.find(class_="hot-sections").find_all('li')

Para instalar la librer铆a lxml con anaconda:

conda install lxml

A m铆 me resulta m谩s f谩cil seleccionar la etiqueta como si estuviera seleccionando un elemento en CSS:

s.select('.hot-sections li')

No se si justo cambi贸 el html del diario pero a mi me result贸 con este c贸digo:

s.find('div', attrs={'class':'p12-dropdown-column'})
s.find('div', attrs={'class':'p12-dropdown-column'}).find_all('a')

Suerte!

Hola, estoy intentando hacer un scrapping de una pagina que requiere autenticacion, como es ese proceso?

Hola, el sitio ha cambiado desde el video y al d矛a de hoy solo debemos encontrar la nueva clase, a mi me funciono:

s.find('ul',attrs={'class':'horizontal-list main-sections hide-on-dropdown'})

alguien sabe por que emplea 鈥榣xml鈥 y no solo 鈥榟tml.parser鈥?

LA P脕GINA WEB SE RENOV脫, as铆 que creo que un reto mejor ahora es ENCONTRAR Escriben hoy.

Yo lo hice y obtuve esto:

s.find('ul')
#Regresa el primer valor que encuentra dentro de la estruutra de la p谩g.

<ul class="horizontal-list main-supplements"><li><span class="today">Hoy:</span></li><li class=""><a href="https://www.pagina12.com.ar/suplementos/libero">L铆bero</a></li></ul>

C贸mo este no es reulstado que desea uso attrs

s.find('ul',attrs={'class':'list column small-12'})
<ul class="list column small-12"><li><a href="/autores/74412-candela-gomes-diez">Candela Gomes Diez</a></li><li><a href="/autores/659-eduardo-aliverti">Eduardo Aliverti</a></li><li><a href="/autores/8445-elena-llorente">Elena Llorente</a></li><li><a href="/autores/831-federico-lisica">Federico Lisica</a></li><li><a href="/autores/272597-flor-de-la-v">Flor de la V</a></li><li><a href="/autores/227200-francisco-d-andrea">Francisco D'Andrea</a></li><li><a href="/autores/217531-guido-vassallo">Guido Vassallo</a></li><li><a href="/autores/845-gustavo-veiga">Gustavo Veiga</a></li><li><a href="/339380-alcira-profesora-y-diputada">Jorge Carpio y Horacio Gonz谩lez</a></li><li><a href="/339322-se-amplian-las-restricciones-por-la-pandemia">Juan Giosa</a></li><li><a href="/autores/863-juan-jose-panno">Juan Jos茅 Panno</a></li><li><a href="/autores/1998-julian-varsavsky">Juli谩n Varsavsky</a></li><li><a href="/autores/872-laura-vales">Laura Vales</a></li><li><a href="/autores/1808-leandro-arteaga">Leandro Arteaga</a></li><li><a href="/339276-en-esta-noche-en-este-mundo">Lila M. Feldman</a></li><li><a href="/autores/217276-maira-lopez">Maira L贸pez</a></li><li><a href="/autores/237906-melisa-molina">Melisa Molina</a></li><li><a href="/autores/1856-mempo-giardinelli">Mempo Giardinelli</a></li><li><a href="/autores/217443-nicolas-hirtz">Nicol谩s Hirtz</a></li><li><a href="/autores/83836-pablo-amalfitano">Pablo Amalfitano</a></li><li><a href="/autores/287997-patricia-chaina">Patricia Chaina</a></li><li><a href="/autores/275187-pibas-con-pelotas">Pibas con Pelotas</a></li><li><a href="/autores/1239-raul-kollmann">Ra煤l Kollmann</a></li><li><a href="/339251-ella-tiembla">Sebasti谩n Rogelio Ocampo</a></li><li><a href="/autores/5997-silvina-friera">Silvina Friera</a></li><li><a href="/autores/1243-victor-wolf">Victor Wolf</a></li><li><a href="/339262-que-hacer-para-controlar-la-inflacion">Victoria Giarrizzo y Nadia Schuffer</a></li><li><a href="/autores/335568-yemina-castellino">Y茅mina Castellino</a></li></ul>

Finalmete ordeno el contenido:

s.find('ul',attrs={'class':'list column small-12'}).find_all('li')

[<li><a href="/autores/74412-candela-gomes-diez">Candela Gomes Diez</a></li>,
 <li><a href="/autores/659-eduardo-aliverti">Eduardo Aliverti</a></li>,
 <li><a href="/autores/8445-elena-llorente">Elena Llorente</a></li>,
 <li><a href="/autores/831-federico-lisica">Federico Lisica</a></li>,
 <li><a href="/autores/272597-flor-de-la-v">Flor de la V</a></li>,
 <li><a href="/autores/227200-francisco-d-andrea">Francisco D'Andrea</a></li>,
 <li><a href="/autores/217531-guido-vassallo">Guido Vassallo</a></li>,
 <li><a href="/autores/845-gustavo-veiga">Gustavo Veiga</a></li>,
 <li><a href="/339380-alcira-profesora-y-diputada">Jorge Carpio y Horacio Gonz谩lez</a></li>,
 <li><a href="/339322-se-amplian-las-restricciones-por-la-pandemia">Juan Giosa</a></li>,
 <li><a href="/autores/863-juan-jose-panno">Juan Jos茅 Panno</a></li>,
 <li><a href="/autores/1998-julian-varsavsky">Juli谩n Varsavsky</a></li>,
 <li><a href="/autores/872-laura-vales">Laura Vales</a></li>,
 <li><a href="/autores/1808-leandro-arteaga">Leandro Arteaga</a></li>,
 <li><a href="/339276-en-esta-noche-en-este-mundo">Lila M. Feldman</a></li>,
 <li><a href="/autores/217276-maira-lopez">Maira L贸pez</a></li>,
 <li><a href="/autores/237906-melisa-molina">Melisa Molina</a></li>,
 <li><a href="/autores/1856-mempo-giardinelli">Mempo Giardinelli</a></li>,
 <li><a href="/autores/217443-nicolas-hirtz">Nicol谩s Hirtz</a></li>,
 <li><a href="/autores/83836-pablo-amalfitano">Pablo Amalfitano</a></li>,
 <li><a href="/autores/287997-patricia-chaina">Patricia Chaina</a></li>,
 <li><a href="/autores/275187-pibas-con-pelotas">Pibas con Pelotas</a></li>,
 <li><a href="/autores/1239-raul-kollmann">Ra煤l Kollmann</a></li>,
 <li><a href="/339251-ella-tiembla">Sebasti谩n Rogelio Ocampo</a></li>,
 <li><a href="/autores/5997-silvina-friera">Silvina Friera</a></li>,
 <li><a href="/autores/1243-victor-wolf">Victor Wolf</a></li>,
 <li><a href="/339262-que-hacer-para-controlar-la-inflacion">Victoria Giarrizzo y Nadia Schuffer</a></li>,
 <li><a href="/autores/335568-yemina-castellino">Y茅mina Castellino</a></li>]

ESPERO QUE LES SIRVA A LOS QUE NUEVOS 馃槃

A m铆 me funcion贸:

s.find(鈥div鈥, attrs = {鈥class鈥: 鈥榩12-dropdown-pane鈥檥).find_all(鈥榓鈥)

C贸digo para encontrar las secciones (Hoy 20/3/2021)

url = "https://www.pagina12.com.ar"
p12 = requests.get(url)

dropdown_id = "p12-dropdown-desktop"
dropdown_content_class = "p12-dropdown-column"
links_item = "p12-dropdown-item"

soup = BeautifulSoup(p12.text, "html.parser")
dropdown = soup.find("div", attrs={"id": dropdown_id})
soup = BeautifulSoup(str(dropdown), "html.parser")
column = soup.find("div", attrs={"class": dropdown_content_class})
soup = BeautifulSoup(str(column), "html.parser")
sections = soup.find_all("a", attrs={"class": links_item})
sections = [section.text for section in sections]
sections

Mi resumen de la clase

La p谩gina ha cambiado desde entonces, as铆 me quedo a mi.

S.find('ul', attrs={'class':'main-sections'}).find_all('li')

Actualizaci贸n 01/2021 funcionando- La estructura de la pagina ha variado
En mi caso yo lo hice con el titulo de 鈥渆conom铆a鈥 y la class de la ul que lo contiene es 鈥榟orizontal-list main-sections hide-on-dropdown鈥


s.find('ul')
s.find('ul', attrs={'horizontal-list main-sections hide-on-dropdown'})
s.find('ul', attrs={'class':'horizontal-list main-sections hide-on-dropdown'}).find_all('li')

no me funciona el .find all

Con Esc salen del 鈥渃ell鈥 del notebook, con b crean la nueva 鈥渃elda鈥 debajo de la que estan, con d+d eliminan esa celda, y con ctrl + enter ejecutan la linea (celda)

Hola, yo estoy trabajando con uan version de jupyter notebook online de binder por un problema de memoria que tengo en mi computadora. Alguien por causalidad ha intentado instalar BeautifulSoup4 en este ambiente? Gracias