web-dev-qa-db-fra.com

Belle soupe et extraction d'une div et de son contenu par ID

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

Pourquoi cela ne retourne-t-il PAS les balises <div id="articlebody"> ... </div> et les éléments intermédiaires? Cela ne retourne rien. Et je sais pertinemment qu’il existe parce que je le regarde juste de

soup.prettify()

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

Edit: Il n'y a pas de réponse à ce message - comment puis-je le supprimer? J'ai constaté que BeautifulSoup n'analyse pas correctement, ce qui signifie probablement que la page que j'essaie d'analyser n'est pas correctement formatée au format SGML ou ailleurs.

130
Tony Stark

Vous devriez poster votre exemple de document, car le code fonctionne bien:

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

Trouver <div>s à l'intérieur de <div>s fonctionne également:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>
177
Lukáš Lalinský

Pour trouver un élément par son id:

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

Beautiful Soup 4 prend en charge la plupart des sélecteurs CSS avec la méthode .select() . peut utiliser un sélecteur id tel que:

soup.select('#articlebody')

Si vous devez spécifier le type de l'élément, vous pouvez ajouter un sélecteur de type avant le sélecteur id:

soup.select('div#articlebody')

La méthode .select() renverra une collection d'éléments, ce qui signifie qu'elle renverra les mêmes résultats que l'exemple suivant .find_all() :

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

Si vous souhaitez uniquement sélectionner un seul élément, vous pouvez simplement utiliser la méthode .find() :

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

Je pense qu'il y a un problème lorsque les balises 'div' sont trop imbriquées. J'essaie d'analyser certains contacts à partir d'un fichier HTML, et le Beautifulsoup ne peut pas trouver les balises "div" avec la classe "fcontent".

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

Le code source HTML peut être n’importe quelle page de la liste d’amis d’un ami de vous (et non celle de vos amis). Si quelqu'un peut le tester et donner quelques conseils, je l'apprécierais vraiment.

C'est mon code, où j'essaye juste 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)
11
omar

Probablement parce que l'analyseur par défaut de beautifulsoup a un problème. Modifiez un analyseur différent, tel que 'lxml' et réessayez.

9
liang

Dans la source beautifulsoup, cette ligne permet aux divs d'être imbriquées dans divs; de sorte que votre préoccupation dans le commentaire de Lukas ne serait pas valable.

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

Ce que je pense que vous devez faire est de spécifier les attributs que vous souhaitez, tels que

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

avez-vous essayé soup.findAll("div", {"id": "articlebody"})?

cela semble fou, mais si vous extrayez des choses de la nature, vous ne pouvez pas exclure plusieurs divs ...

5
user106514

J'ai utilisé:

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

Comme ma syntaxe pour find/findall; Cela dit, à moins qu'il y ait d'autres paramètres facultatifs entre la balise et la liste d'attributs, cela ne devrait pas être différent.

4
user257111

Arrivé à moi aussi en essayant de gratter Google.
J'ai fini par utiliser pyquery.
Installer:

pip install pyquery

Utilisation:

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

Voici un fragment de code

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

Comme vous pouvez le voir, je trouve toutes les balises, puis toutes les balises avec class = "article" à l'intérieur.

3
Recursion