tutorial scraping examples code python screen-scraping beautifulsoup

python - scraping - Beautiful Soup no puede encontrar una clase CSS si el objeto tiene otras clases, tambiƩn



scraping python 3 (4)

si una página tiene <div class="class1"> y <p class="class1"> , entonces soup.findAll(True, ''class1'') los encontrará a ambos.

Si tiene <p class="class1 class2"> , sin embargo, no se encontrará. ¿Cómo encuentro todos los objetos con una cierta clase, independientemente de si también tienen otras clases?


Deberías usar lxml . Funciona con múltiples valores de clase separados por espacios (''class1 class2'').

A pesar de su nombre, lxml también es para analizar y raspar HTML. Es mucho, mucho más rápido que BeautifulSoup, e incluso maneja HTML "roto" mejor que BeautifulSoup (su reclamo de fama). También tiene una API de compatibilidad para BeautifulSoup si no desea aprender la API lxml.

Ian Bicking está de acuerdo y prefiere lxml sobre BeautifulSoup.

Ya no hay motivo para usar BeautifulSoup, a menos que esté en Google App Engine o algo en el que no se permita nada que no sea puramente Python.

Incluso puede usar selectores de CSS con lxml, por lo que es mucho más fácil de usar que BeautifulSoup. Intenta jugar con él en una consola interactiva de Python.


Desafortunadamente, BeautifulSoup lo trata como una clase con un espacio en él ''class1 class2'' lugar de dos clases [''class1'',''class2''] . Una solución alternativa es usar una expresión regular para buscar la clase en lugar de una cadena.

Esto funciona:

soup.findAll(True, {''class'': re.compile(r''/bclass1/b'')})


En caso de que alguien se encuentre con esta pregunta. BeautifulSoup ahora es compatible con esto:

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] Type "copyright", "credits" or "license" for more information. In [1]: import bs4 In [2]: soup = bs4.BeautifulSoup(''<div class="foo bar"></div>'') In [3]: soup(attrs={''class'': ''bar''}) Out[3]: [<div class="foo bar"></div>]

Además, no tienes que escribir findAll nunca más.


Es muy útil buscar una etiqueta que tenga una determinada clase de CSS, pero el nombre del atributo CSS, "clase", es una palabra reservada en Python. Usar la clase como un argumento de palabra clave le dará un error de sintaxis. A partir de Beautiful Soup 4.1.2, puede buscar por clase de CSS usando la palabra clave argumento class_:

Me gusta:

soup.find_all("a", class_="class1")