link - python soup find
Cómo encontrar elementos por clase. (9)
Estoy teniendo problemas para analizar los elementos html con el atributo "clase" usando Beautifulsoup. El código se ve así
soup = BeautifulSoup(sdata)
mydivs = soup.findAll(''div'')
for div in mydivs:
if (div["class"]=="stylelistrow"):
print div
Aparece un error en la misma línea "después" de que finalice el script.
File "./beautifulcoding.py", line 130, in getlanguage
if (div["class"]=="stylelistrow"):
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup.py", line 599, in __getitem__
return self._getAttrMap()[key]
KeyError: ''class''
¿Cómo me deshago o este error?
Cómo encontrar elementos por clase.
Estoy teniendo problemas para analizar los elementos html con el atributo "clase" usando Beautifulsoup.
Puedes encontrarlo fácilmente por una clase, pero si quieres encontrarlo por la intersección de dos clases, es un poco más difícil,
De la documentation (énfasis añadido):
Si desea buscar etiquetas que coincidan con dos o más clases de CSS, debe usar un selector de CSS:
css_soup.select("p.strikeout.body") # [<p class="body strikeout"></p>]
Para que quede claro, esto selecciona solo las etiquetas p que son tachadas y clase de cuerpo.
Para buscar la intersección de cualquiera en un conjunto de clases (no la intersección, sino la unión), puede dar una lista al argumento de palabra clave class_
(a partir de 4.1.2):
soup = BeautifulSoup(sdata)
class_list = ["stylelistrow"] # can add any other classes to this list.
# will find any divs with any names in class_list:
mydivs = soup.find_all(''div'', class_=class_list)
También tenga en cuenta que se ha cambiado el nombre de findAll de camelCase a más find_all
.
Actualización: 2016 En la última versión de beautifulsoup, el método ''findAll'' ha sido renombrado a ''find_all''. Enlace a la documentación oficial.
De ahí que la respuesta sea
soup.find_all("html_element", class_="your_class_name")
De la documentación:
soup.find_all("a", class_="sister")
Que en este caso sería:
soup.find_all("div", class_="stylelistrow")
También funcionaría para:
soup.find_all("div", class_="stylelistrowone stylelistrowtwo")
Específico para BeautifulSoup 3:
soup.findAll(''div'',
{''class'': lambda x: x
and ''stylelistrow'' in x.split()
}
)
Encontrará todos estos:
<div class="stylelistrow">
<div class="stylelistrow button">
<div class="button stylelistrow">
Esto funcionó para mí:
for div in mydivs:
try:
clazz = div["class"]
except KeyError:
clazz = ""
if (clazz == "stylelistrow"):
print div
Esto me funciona para acceder al atributo de clase (en beautifulsoup 4, al contrario de lo que dice la documentación). El KeyError viene una lista que se devuelve, no un diccionario.
for hit in soup.findAll(name=''span''):
print hit.contents[1][''class'']
Intenta verificar si el div tiene un atributo de clase primero, como este:
soup = BeautifulSoup(sdata)
mydivs = soup.findAll(''div'')
for div in mydivs:
if "class" in div:
if (div["class"]=="stylelistrow"):
print div
Puede refinar su búsqueda para encontrar solo esos divs con una clase dada usando BS3:
mydivs = soup.findAll("div", {"class": "stylelistrow"})
Un camino directo sería:
soup = BeautifulSoup(sdata)
for each_div in soup.findAll(''div'',{''class'':''stylelist''}):
print each_div
Asegúrese de tomar de la carcasa de findAll , no de findall