soup link find_next_sibling python html beautifulsoup

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



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