Cómo encontrar elementos por clase.

Estoy teniendo problemas para analizar 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?

Puede refinar su búsqueda para encontrar solo esos divs con una clase dada usando BS3:

 mydivs = soup.findAll("div", {"class": "stylelistrow"}) 

De la documentación:

A partir de Beautiful Soup 4.1.2, puede buscar por clase CSS usando el argumento de palabra clave class_ :

 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") 

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.

Lista de nombres de métodos cambiados

De ahí que la respuesta sea

 soup.find_all("html_element", class_="your_class_name") 

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

Específico para BeautifulSoup 3:

 soup.findAll('div', {'class': lambda x: x and 'stylelistrow' in x.split() } ) 

Encontrará todos estos:

 

Cómo encontrar elementos por clase.

Estoy teniendo problemas para analizar 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 documentación (énfasis agregado):

Si desea buscar tags que coincidan con dos o más clases de CSS, debe usar un selector de CSS:

 css_soup.select("p.strikeout.body") # [

]

Para que quede claro, esto selecciona solo las tags 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 .

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 

Esto me funciona para acceder al atributo de clase (en beautifulsoup 4, al contrario de lo que dice la documentación). KeyError es una lista que se devuelve, no un diccionario.

 for hit in soup.findAll(name='span'): print hit.contents[1]['class'] 

Esto funcionó para mí:

 for div in mydivs: try: clazz = div["class"] except KeyError: clazz = "" if (clazz == "stylelistrow"): print div