En un tutorial anterior, te mostré cómo usar el módulo de solicitudes para acceder a páginas web usando Python. El tutorial cubrió una gran cantidad de temas como realizar solicitudes GET / POST y descargar cosas como imágenes o archivos PDF mediante programación. Lo único que faltaba en ese tutorial era una guía sobre cómo raspar las páginas web a las que accedió utilizando Solicitudes para extraer la información que necesita.
En este tutorial, aprenderá acerca de Beautiful Soup, que es una biblioteca de Python para extraer datos de archivos HTML. El enfoque en este tutorial será en aprender los conceptos básicos de la biblioteca, y los temas más avanzados se tratarán en el siguiente tutorial. Tenga en cuenta que este tutorial utiliza Beautiful Soup 4 para todos los ejemplos..
Puedes instalar Beautiful Soup 4 usando pipa
. El nombre del paquete es beautifulsoup4
. Debería funcionar tanto en Python 2 como en Python 3.
$ pip instalar beautifulsoup4
Si no tiene pip instalado en su sistema, puede descargar directamente el archivo fuente Soup 4 de Beautiful Soup e instalarlo usando setup.py
.
$ python setup.py install
BeautifulSoup se empaqueta originalmente como código de Python 2. Cuando lo instala para usarlo con Python 3, se actualiza automáticamente al código de Python 3. El código no se convertirá a menos que instale el paquete. Aquí hay algunos errores comunes que podrías notar:
ImportError
ocurre cuando está ejecutando la versión de Python 2 del código en Python 3.ImportError
ocurre cuando está ejecutando la versión de Python 3 del código en Python 2.Los dos errores anteriores se pueden corregir desinstalando y reinstalando Beautiful Soup.
Antes de discutir las diferencias entre los diferentes analizadores que puedes usar con Beautiful Soup, escribamos el código para crear una sopa..
desde bs4 importamos la sopa BeautifulSoup = BeautifulSoup ("Esto es HTML inválido
"," html.parser ")
los BeautifulSoup
El objeto puede aceptar dos argumentos. El primer argumento es el marcado real, y el segundo argumento es el analizador que desea utilizar. Los diferentes analizadores son: html.parser
, lxml, y html5lib. los lxml
el analizador tiene dos versiones, un analizador HTML y un analizador XML.
los html.parser
es un analizador incorporado, y no funciona tan bien en versiones anteriores de Python. Puedes instalar los otros analizadores usando los siguientes comandos:
$ pip install lxml $ pip install html5lib
los lxml
el analizador es muy rápido y se puede utilizar para analizar rápidamente el HTML dado. Por otro lado, la html5lib
el analizador es muy lento, pero también es extremadamente indulgente. Aquí hay un ejemplo del uso de cada uno de estos analizadores:
sopa = BeautifulSoup ("Esto es HTML inválido
"," html.parser ") print (soup) #Esto es HTML inválido
sopa = BeautifulSoup ("Esto es HTML inválido
"," lxml ") imprimir (sopa) #Esto es HTML inválido
sopa = BeautifulSoup ("Esto es HTML inválido
"," xml ") imprimir (sopa) # #Esto es HTML inválido
sopa = BeautifulSoup ("Esto es HTML inválido
"," html5lib ") imprimir (sopa) #Esto es HTML inválido
Las diferencias descritas en el ejemplo anterior solo son importantes cuando se analiza HTML no válido. Sin embargo, la mayoría del HTML en la web tiene un formato incorrecto, y conocer estas diferencias lo ayudará a depurar algunos errores de análisis y a decidir qué analizador desea utilizar en un proyecto. En general, la lxml
parser es una muy buena opción.
Beautiful Soup analiza el documento HTML dado en un árbol de objetos Python. Hay cuatro objetos principales de Python que debes conocer: Etiqueta
, NavegableString
, BeautifulSoup
, y Comentario
.
los Etiqueta
objeto se refiere a una etiqueta XML o HTML real en el documento. Puede acceder al nombre de una etiqueta usando tag.name
. También puede establecer el nombre de una etiqueta a otra cosa. El cambio de nombre será visible en el marcado generado por Beautiful Soup.
Puede acceder a diferentes atributos como la clase y la identificación de una etiqueta usando etiqueta ['clase']
y etiqueta ['id']
respectivamente. También puede acceder a todo el diccionario de atributos usando tag.attrs
. También puede agregar, eliminar o modificar los atributos de una etiqueta. Los atributos como el de un elemento. clase
que puede tomar múltiples valores se almacenan como una lista.
El texto dentro de una etiqueta se almacena como un NavegableString
En Sopa Hermosa. Tiene algunos métodos útiles como replace_with ("cadena")
Para reemplazar el texto dentro de una etiqueta. También puedes convertir un NavegableString
para unicode cadena utilizando Unicode ()
.
Beautiful Soup también te permite acceder a los comentarios en una página web. Estos comentarios se almacenan como un Comentario
objeto, que también es básicamente un NavegableString
.
Ya has aprendido sobre el BeautifulSoup
Objeto en la sección anterior. Se utiliza para representar el documento en su conjunto. Dado que no es un objeto real, no tiene ningún nombre o atributos.
Puede extraer el título de la página y otros datos similares fácilmente usando Beautiful Soup. Vamos a raspar la página de Wikipedia sobre Python. Primero, tendrá que obtener el marcado de la página utilizando el siguiente código basado en el tutorial del módulo Solicitudes para acceder a las páginas web.
importar solicitudes desde bs4 import BeautifulSoup req = requests.get ('https://en.wikipedia.org/wiki/Python_ (schedule_language)') soup = BeautifulSoup (req.text, "lxml")
Ahora que ha creado la sopa, puede obtener el título de la página web utilizando el siguiente código:
sopa.título #Python (lenguaje de programación) - Wikipedia soup.title.name # 'title' soup.title.string # 'Python (lenguaje de programación) - Wikipedia'
También puede raspar la página web para obtener otra información, como el encabezado principal o el primer párrafo, sus clases o el carné de identidad
atributo.
soup.h1 #Python (lenguaje de programación)
soup.h1.string # 'Python (lenguaje de programación)' soup.h1 ['clase'] # ['firstHeading'] soup.h1 ['id'] # 'firstHeading' soup.h1.attrs # 'class': ['firstHeading'], 'id': 'firstHeading', 'lang': 'en' soup.h1 ['class'] = 'firstHeading, mainHeading' soup.h1.string.replace_with ("Python - Lenguaje de programación" ) del soup.h1 ['lang'] del soup.h1 ['id'] soup.h1 #Python - Lenguaje de programación
Del mismo modo, puede iterar a través de todos los enlaces o subtítulos en un documento usando el siguiente código:
para subtítulos en soup.find_all ('h2'): print (sub_heading.text) # todos los subtítulos como Contenido, Historial [editar] ...
Puede navegar a través del árbol DOM usando nombres de etiquetas regulares. Encadenar esos nombres de etiquetas puede ayudarte a navegar el árbol más profundamente. Por ejemplo, puede obtener el primer enlace en el primer párrafo de la página de Wikipedia dada usando sopa.p.a
. Se puede acceder a todos los enlaces en el primer párrafo usando soup.p.find_all ('a')
.
También puede acceder a todos los elementos secundarios de una etiqueta como una lista usando tag.contents
. Para obtener los niños en un índice específico, puede utilizar tag.contents [índice]
. También puede iterar sobre los hijos de una etiqueta usando el .niños
atributo.
Ambos .niños
y .contenido
son útiles solo cuando desea acceder a los descendientes directos o de primer nivel de una etiqueta. Para obtener todos los descendientes, puede utilizar el .descendientes
atributo.
imprimir (soup.p.contents) # [Pitón, 'es un documento ampliamente utilizado', ... la lista completa] print (soup.p.contents [10]) # legibilidad para niños en soup.p.children: print (child.name) # b # None # a # None # a # Ninguna # ... y así sucesivamente.
También puede acceder al padre de un elemento utilizando la .padre
atributo. Del mismo modo, puede acceder a todos los ancestros de un elemento utilizando el .los padres
atributo. El padre del nivel superior. etiqueta es la
BeautifulSoup
Objeto en sí mismo, y su padre es Ninguno.
print (soup.p.parent.name) # div para los padres en soup.p.parents: print (parent.name) # div # div # div # body # html # [documento]
Puede acceder al hermano anterior y siguiente de un elemento utilizando el .parentesco anterior
y .proximo hermano
atributos.
Para que dos elementos sean hermanos, deben tener el mismo padre. Esto significa que el primer hijo de un elemento no tendrá un hermano anterior. Del mismo modo, el último hijo del elemento no tendrá un próximo hermano. En las páginas web reales, los hermanos anteriores y siguientes de un elemento probablemente serán un nuevo carácter de línea.
También puede iterar sobre todos los hermanos de un elemento usando .cumplimientos anteriores
y .next_siblings
.
soup.head.next_sibling # '\ n' soup.p.a.next_sibling # 'for' soup.p.a.previous_sibling # 'es una impresión muy utilizada' (soup.p.b.previous_sibling) # Ninguna
Puede ir al elemento que viene inmediatamente después del elemento actual usando el .siguiente_elemento
atributo. Para acceder al elemento que viene inmediatamente antes del elemento actual, use la .elemento anterior
atributo.
De manera similar, puede iterar sobre todos los elementos que vienen antes y después del elemento actual usando .elementos anteriores
y .próximos_elementos
respectivamente.
Después de completar este tutorial, ahora debería tener una buena comprensión de las principales diferencias entre los diferentes analizadores de HTML. Ahora también debería poder navegar a través de una página web y extraer datos importantes. Esto puede ser útil cuando desea analizar todos los encabezados o enlaces en un sitio web determinado.
En la siguiente parte de la serie, aprenderá cómo usar la biblioteca Beautiful Soup para buscar y modificar el DOM..