scraping how from examples python beautifulsoup

python - how - Hermosa sopa y extraer un div y su contenido por ID



python beautifulsoup find element (10)

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

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

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

¿Por qué NO devuelve las <div id="articlebody"> ... </div> y otras cosas? No devuelve nada. Y sé con certeza que existe porque lo estoy mirando desde

soup.prettify()

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

Editar: no hay respuesta para esta publicación, ¿cómo la elimino? Descubrí que BeautifulSoup no está analizando correctamente, lo que probablemente significa que la página que intento analizar no está formateada correctamente en SGML o lo que sea.


Aquí hay un fragmento de código

soup = BeautifulSoup(:"index.html") titleList = soup.findAll(''title'') divList = soup.findAll(''div'', attrs={ "class" : "article story"})

Como puedes ver, encuentro todas las etiquetas y luego encuentro todas las etiquetas con class = "article" en el interior


Beautiful Soup 4 es compatible con la mayoría de los selectores de CSS con el método .select() , por lo tanto, puede usar un selector de id como:

soup.select(''#articlebody'')

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

soup.select(''div#articlebody'')

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

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

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

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 el Beautifulsoup no puede encontrar las etiquetas "div" con la clase "fcontent".

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

El código fuente html puede ser cualquier página de Facebook de la lista de amigos de un amigo (no el de tus amigos). Si alguien puede probarlo y dar un consejo, realmente lo agradecería.

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)


Debería 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>

Encontrar <div> s dentro de <div> s también funciona:

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


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''})


Lo más probable es que debido al analizador preconfigurado de beautifulsoup tenga un problema. Cambie un analizador diferente, como ''lxml'' y vuelva a intentarlo.


Me sucedió también al tratar de raspar Google.
Terminé usando pyquery.
Instalar:

pip install pyquery

Utilizar:

from pyquery import PyQuery pq = PyQuery(''<html><body><div id="articlebody"> ... </div></body></html'') tag = pq(''div#articlebody'')


Para encontrar un elemento por su id :

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


Solía:

soup.findAll(''tag'', attrs={''attrname'':"attrvalue"})

Como mi sintaxis para find / findall; Dicho esto, a menos que haya otros parámetros opcionales entre la etiqueta y la lista de atributos, esto no debería ser diferente.