Beautiful Soup y extrayendo un div y su contenido por ID

4 minutos de lectura

avatar de usuario
tony stark

soup.find("tagName", { "id" : "articlebody" })

¿Por qué esto NO devuelve el <div id="articlebody"> ... </div> etiquetas y cosas en el medio? No devuelve nada. Y sé con certeza que existe porque lo estoy mirando directamente desde

soup.prettify()

soup.find("div", { "id" : "articlebody" }) tampoco funciona.

(EDITAR: Descubrí que BeautifulSoup no estaba analizando correctamente mi página, lo que probablemente significaba que la página que estaba tratando de analizar no estaba formateada correctamente en SGML o lo que sea)

  • (Para su EDICIÓN, esta pregunta aún tiene valor como recurso reutilizable para otros, incluso si el analizador no funciona en su página en particular)

    – smci

    7 de junio de 2020 a las 1:14


avatar de usuario
Lukáš Lalinský

Debe publicar su documento de ejemplo, porque el código funciona bien:

>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

Hallazgo <div>está dentro <div>s funciona también:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

  • mi documento de ejemplo es enorme. Estoy rastreando el problema. Creo que esto no funciona en divs de divs. Hice un conteo de cuántos divs hay en el documento con print len(sopa(‘div’)) que resultó en 10, y puedo ver CLARAMENTE más de 10 divs con firebug. así que creo que simplemente no puede encontrar divs dentro de divs, así que necesito reducir las cosas envoltorio por envoltorio.

    –Tony Stark

    25 de enero de 2010 a las 22:59


  • Bueno, entonces es imposible responder a su pregunta, las bolas de cristal no son una forma confiable de depuración. 🙂

    – Lukaš Lalinský

    25 de enero de 2010 a las 23:00

  • Probé este código. el div tiene y no puedo imprimir el incrustado dentro de él.

    – Vicente

    3 de diciembre de 2013 a las 8:06

  • o más simplemente div = soup.find(id="articlebody")

    – jfs

    5 mayo 2014 a las 17:39

  • o soup.find('div', id='articlebody')

    – Trevor Boyd Smith

    11 de noviembre de 2016 a las 21:19

Para encontrar un elemento por su id:

div = soup.find(id="articlebody")

  • ¿Quizás esto es para una versión anterior? Exception: TypeError: find() takes no keyword arguments

    – codificador de barcos

    15 abr a las 20:25

  • @boatcoder funciona con la última versión (4.11.1)

    – jfs

    16 abr a las 21:46

  • replit.com/@zed1/bs4-find

    – jfs

    17 abr a las 11:44

avatar de usuario
jose crozier

Beautiful Soup 4 es compatible con la mayoría Selectores de CSS con el .select() métodopor lo tanto, puede utilizar un id selector como:

soup.select('#articlebody')

Si necesita especificar el tipo de elemento, puede agregar un selector de tipo antes de id selector:

soup.select('div#articlebody')

los .select() devolverá una colección de elementos, lo que significa que devolverá los mismos resultados que el siguiente .find_all() método ejemplo:

soup.find_all('div', id="articlebody")
# or
soup.find_all(id="articlebody")

Si solo desea seleccionar un solo elemento, puede usar el .find() método:

soup.find('div', id="articlebody")
# or
soup.find(id="articlebody")

Creo que hay un problema cuando las etiquetas ‘div’ están demasiado anidadas. Estoy tratando de analizar algunos contactos de un archivo html de Facebook, y Beautifulsoup no puede encontrar las etiquetas “div” con la clase “fcontent”.

Esto sucede con otras clases también. Cuando busco divs en general, solo muestra aquellos que no están tan anidados.

El código fuente html puede ser cualquier página de facebook de la lista de amigos de un amigo tuyo (no la de tus amigos). Si alguien puede probarlo y dar algún consejo se lo agradecería mucho.

Este es mi código, donde intento imprimir el número de etiquetas “div” con la clase “fcontent”:

from BeautifulSoup import BeautifulSoup 
f = open('/Users/myUserName/Desktop/contacts.html')
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'class':'fcontent'})
print len(list)

Lo más probable es que el analizador beautifulsoup predeterminado tenga un problema. Cambie un analizador diferente, como ‘lxml’ y vuelva a intentarlo.

  • Esto funcionó para mí, gracias! solía soup = BeautifulSoup(data, parser="html.parser")

    – will-hart

    10 de junio de 2014 a las 22:11


En la fuente beautifulsoup, esta línea permite anidar divs dentro de divs; entonces su preocupación en el comentario de lukas no sería válida.

NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']

Lo que creo que debe hacer es especificar los atributos que desea, como

source.find('div', attrs={'id':'articlebody'})

  • Esto funcionó para mí, gracias! solía soup = BeautifulSoup(data, parser="html.parser")

    – will-hart

    10 de junio de 2014 a las 22:11


avatar de usuario
usuario106514

has probado soup.findAll("div", {"id": "articlebody"})?

suena loco, pero si estás extrayendo cosas de la naturaleza, no puedes descartar múltiples divs…

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad