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.
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>
Pour trouver un élément par son id
:
div = soup.find(id="articlebody")
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")
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)
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.
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'})
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 ...
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.
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')
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.