Saltar al contenido

Beautiful Soup 4 Python – PythonForBeginners.com

Visión general

Este artículo es una introducción a BeautifulSoup 4 en Python. Si quieres saber más te recomiendo leer la documentación oficial encontrada aquí.

¿Qué es Beautiful Soup?

Beautiful Soup es una biblioteca de Python para extraer datos de archivos HTML y XML.

BeautifulSoup 3 o 4?

Beautiful Soup 3 ha sido reemplazado por Beautiful Soup 4. Beautiful Soup 3 solo funciona en Python 2.x, pero Beautiful Soup 4 también funciona en Python 3.x. Beautiful Soup 4 es más rápido, tiene más funciones y funciona con analizadores de terceros como lxml y html5lib. Debe usar Beautiful Soup 4 para todos los proyectos nuevos.

Instalación de Beautiful Soup

Si ejecuta Debian o Ubuntu, puede instalar Beautiful Soup con el administrador de paquetes del sistema

apt-get install python-bs4

Beautiful Soup 4 se publica a través de PyPi, por lo que si no puede instalarlo con el empaquetador del sistema, puede instalarlo con easy_install o pip. El nombre del paquete es beautifulsoup4, y el mismo paquete funciona en Python 2 y Python 3.

easy_install beautifulsoup4

pip install beautifulsoup4

Si no tiene easy_install o pip instalado, puede descargar el tarball fuente de Beautiful Soup 4 e instálelo con setup.py. instalación de python setup.py

Hermoso uso de sopa

Inmediatamente después de la instalación, puede comenzar a usar BeautifulSoup. Al comienzo de su secuencia de comandos de Python, importe la biblioteca. Ahora debe pasar algo a BeautifulSoup para crear un objeto de sopa. Podría ser un documento o una URL. BeautifulSoup no busca la página web por usted, debe hacerlo usted mismo. Por eso utilizo urllib2 en combinación con la biblioteca BeautifulSoup.

Filtración

Hay algunos filtros diferentes que puede usar con la API de búsqueda. A continuación, le mostraré algunos ejemplos sobre cómo puede pasar esos filtros a métodos como find_all. Puede usar estos filtros basándose en el nombre de una etiqueta, en sus atributos, en el texto de una cadena o en alguna combinación de estos.

Una cuerda

El filtro más simple es una cadena. Pase una cadena a un método de búsqueda y Beautiful Soup realizará una coincidencia con esa cadena exacta. Este código encuentra todas las etiquetas ‘b’ en el documento (puede reemplazar b con cualquier etiqueta que desee encontrar)

soup.find_all('b')

Si pasa una cadena de bytes, Beautiful Soup asumirá que la cadena está codificada como UTF-8. Puede evitar esto pasando una cadena Unicode en su lugar.

Una expresión regular

Si pasa un objeto de expresión regular, Beautiful Soup filtrará contra esa expresión regular usando su método match (). Este código busca todas las etiquetas cuyos nombres comienzan con la letra “b”, en este caso, la etiqueta ‘cuerpo’ y la etiqueta ‘b’:

import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)

Este código busca todas las etiquetas cuyos nombres contienen la letra “t”:

for tag in soup.find_all(re.compile("t")):
    print(tag.name)

Una lista

Si pasa en una lista, Beautiful Soup permitirá una coincidencia de cadenas con cualquier elemento de esa lista. Este código encuentra todas las etiquetas ‘a’ y todas las etiquetas ‘b’

print soup.find_all(["a", "b"])

Cierto

El valor True coincide con todo lo que puede. Este código encuentra todas las etiquetas en el documento, pero ninguna de las cadenas de texto:

for tag in soup.find_all(True):
    print(tag.name)

Una función

Si ninguna de las otras coincidencias funciona para usted, defina una función que tome un elemento como único argumento. Consulte la documentación oficial si desea hacerlo.

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.

Objeto BeautifulSoup

Como ejemplo, usaremos el mismo sitio web en el que se encuentra actualmente (https://www.pythonforbeginners.com) Para analizar los datos del contenido, simplemente creamos un objeto BeautifulSoup para él que creará un objeto de sopa de contenido de la URL que pasamos. Desde este punto, ahora podemos usar los métodos Beautiful Soup en ese objeto soup. Podemos usar el método prettify para convertir un árbol de análisis de BS en una cadena Unicode con un formato agradable

El método Find_all

El método find_all es uno de los métodos más comunes en BeautifulSoup. Examina los descendientes de una etiqueta y recupera todos los descendientes que coinciden con sus filtros.

soup.find_all("title")

soup.find_all("p", "title")

soup.find_all("a")

soup.find_all(id="link2")

Veamos algunos ejemplos sobre cómo usar BS 4

from bs4 import BeautifulSoup
import urllib2

url = "https://www.pythonforbeginners.com"

content = urllib2.urlopen(url).read()

soup = BeautifulSoup(content)

print soup.prettify()

print title
>> 'title'? Python For Beginners

print soup.title.string
>> ? Python For Beginners

print soup.p
print soup.a
Python For Beginners

Navegando por el árbol de análisis

Si desea saber cómo navegar por el árbol, consulte al oficial documentación . Allí puede leer sobre las siguientes cosas:

Bajando

  • Navegar usando nombres de etiquetas
  • .contenido y .niños
  • .descendientes
  • .string .strings y stripped_strings

Subiendo

Yendo de lado

  • .next_sibling y .previous_sibling
  • .next_siblings y .previous_siblings

Yendo y viniendo

  • .next_element y .previous_element
  • .next_elements y .previous_elements

Extraer todas las URL que se encuentran dentro de las etiquetas “a” de una página

Una tarea común es extraer todas las URL que se encuentran dentro de las etiquetas ‘a’ de una página. El método find_all nos da una lista completa de elementos con la etiqueta “a”.

for link in soup.find_all('a'):
    print(link.get('href'))
Output:
..https://www.pythonforbeginners.com
..https://www.pythonforbeginners.com/python-overview-start-here/
..https://www.pythonforbeginners.com/dictionary/
..https://www.pythonforbeginners.com/python-functions-cheat-sheet/
..https://www.pythonforbeginners.com/lists/python-lists-cheat-sheet/
..https://www.pythonforbeginners.com/loops/
..https://www.pythonforbeginners.com/python-modules/
..https://www.pythonforbeginners.com/strings/
..https://www.pythonforbeginners.com/sitemap/
...
...

Extrayendo todo el texto de una página

Otra tarea común es extraer todo el texto de una página:

print(soup.get_text())
Output:
Python For Beginners
Python Basics
Dictionary
Functions
Lists
Loops
Modules
Strings
Sitemap
...
...

Obtén todos los enlaces de Reddit

Como último ejemplo, tomemos todos los enlaces de Reddit.

from bs4 import BeautifulSoup
import urllib2

redditFile = urllib2.urlopen("http://www.reddit.com")
redditHtml = redditFile.read()
redditFile.close()

soup = BeautifulSoup(redditHtml)
redditAll = soup.find_all("a")
for links in soup.find_all('a'):
    print (links.get('href'))
Output:
#content
..http://www.reddit.com/r/AdviceAnimals/
..http://www.reddit.com/r/announcements/
..http://www.reddit.com/r/AskReddit/
..http://www.reddit.com/r/atheism/
..http://www.reddit.com/r/aww/
..http://www.reddit.com/r/bestof/
..http://www.reddit.com/r/blog/
..http://www.reddit.com/r/funny/
..http://www.reddit.com/r/gaming/
..http://www.reddit.com/r/IAmA/
..http://www.reddit.com/r/movies/
..http://www.reddit.com/r/Music/
..http://www.reddit.com/r/pics/
..http://www.reddit.com/r/politics/
...

Para obtener más información, consulte el oficial documentación.

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.