218 votes

Beautiful Soup et extraction d'une div et de son contenu par ID

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

Pourquoi cela ne renvoie-t-il PAS le <div id="articlebody"> ... </div> et tout ce qui se trouve entre les deux ? Il ne renvoie rien. Et je sais pertinemment qu'il existe parce que je le regarde directement depuis

soup.prettify()

soup.find("div", { "id" : "articlebody" }) ne fonctionne pas non plus.

( EDIT : J'ai constaté que BeautifulSoup n'analysait pas correctement ma page, ce qui signifie probablement que la page que j'essayais d'analyser n'était pas correctement formatée en SGML ou autre).

0 votes

(Pour votre EDIT, cette question a toujours de la valeur en tant que ressource réutilisable pour d'autres, même si l'analyseur ne fonctionne pas sur votre page en particulier).

302voto

Lukáš Lalinský Points 22537

Vous devriez publier votre document d'exemple, car le code fonctionne correctement :

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

Recherche <div> à l'intérieur <div> Les travaux de la Commission ont également été menés à bien :

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

3 votes

Mon document d'exemple est énorme. je suis en train de trouver le problème - je pense que cela ne fonctionne pas sur les divs de divs. J'ai compté le nombre de divs dans le document avec print len(soup('div')) qui a donné 10, et je peux CLAIREMENT voir plus de 10 divs avec firebug. Je pense donc qu'il ne peut pas trouver les divs à l'intérieur des divs, et je dois donc réduire les choses enveloppe par enveloppe.

10 votes

Dans ce cas, il est impossible de répondre à votre question, les boules de cristal ne sont pas un moyen fiable de débogage :)

1 votes

J'ai essayé ce code, mais la div a <embed> et je ne peux pas imprimer l'embed à l'intérieur.

128voto

J.F. Sebastian Points 102961

Pour trouver un élément par son id :

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

2 votes

Peut-être s'agit-il d'une ancienne version ? Exception: TypeError: find() takes no keyword arguments

1 votes

@boatcoder cela fonctionne avec la dernière version (4.11.1)

0 votes

17voto

omar Points 51

Je pense qu'il y a un problème lorsque les balises "div" sont trop imbriquées. J'essaie d'analyser des contacts à partir d'un fichier html facebook, et Beautifulsoup n'est pas capable de trouver les balises "div" avec la classe "fcontent".

Cela se produit également avec d'autres classes. Lorsque je cherche des divs en général, je ne trouve que ceux qui ne sont pas tellement imbriqués.

Le code source html peut être n'importe quelle page de facebook de la liste d'amis d'un de vos amis (pas celui de vos amis). Si quelqu'un peut le tester et donner des conseils, j'apprécierais beaucoup.

Voici mon code, dans lequel j'essaie d'imprimer le nombre de balises "div" avec la classe "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)

0 votes

Il pourrait s'agir d'un bogue. Enregistrer un problème peut-être ?

9voto

liang Points 154

Probablement à cause du problème de l'analyseur par défaut de beautifulsoup. Changez d'analyseur, comme 'lxml', et réessayez.

0 votes

Cela a fonctionné pour moi, merci ! J'ai utilisé soup = BeautifulSoup(data, parser="html.parser")

8voto

dagoof Points 714

Dans la source de beautifulsoup, cette ligne permet aux divs d'être imbriquées les unes dans les autres ; donc votre préoccupation dans le commentaire de Lukas ne serait pas valide.

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

Ce que vous devez faire, je pense, c'est spécifier les attrs que vous voulez, comme par exemple

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X