soup.find("tagName", { "id" : "articlebody" })
Pourquoi cela ne renvoie PAS les <div id="articlebody"> ... </div>
balises et les éléments intermédiaires? Il ne renvoie rien. Et je sais pertinemment que ça existe parce que je le regarde depuis
soup.prettify()
soup.find("div", { "id" : "articlebody" })
ne fonctionne pas non plus.
( EDIT: j'ai trouvé que BeautifulSoup n'analysait pas correctement ma page, ce qui signifiait probablement que la page que j'essayais d'analyser n'est pas correctement formatée en SGML ou autre)
python
beautifulsoup
Tony Stark
la source
la source
Réponses:
Vous devez publier votre exemple de document, car le code fonctionne correctement:
Trouver
<div>
s à l'intérieur de<div>
s fonctionne également:la source
div = soup.find(id="articlebody")
soup.find('div', id='articlebody')
Pour rechercher un élément par son
id
:la source
Beautiful Soup 4 prend en charge la plupart des sélecteurs CSS avec la
.select()
méthode , vous pouvez donc utiliser unid
sélecteur tel que:Si vous devez spécifier le type de l'élément, vous pouvez ajouter un sélecteur de type avant le
id
sélecteur:La
.select()
méthode retournera une collection d'éléments, ce qui signifie qu'elle renverra les mêmes résultats que l' exemple de.find_all()
méthode suivant :Si vous ne souhaitez sélectionner qu'un seul élément, vous pouvez simplement utiliser la
.find()
méthode :la source
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 facebook, et Beautifulsoup ne parvient pas à trouver les balises "div" avec la classe "fcontent".
Cela se produit également avec d'autres classes. Quand je recherche des divs en général, cela ne tourne 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 celle de vos amis). Si quelqu'un peut le tester et donner des conseils, je l'apprécierais vraiment.
Voici mon code, où j'essaye juste d'imprimer le nombre de balises "div" avec la classe "fcontent":
la source
Très probablement à cause de l'analyseur par défaut de beautifulsoup a un problème. Changez un analyseur différent, comme «lxml» et réessayez.
la source
soup = BeautifulSoup(data, parser="html.parser")
Dans la source beautifulsoup, cette ligne permet aux div d'être imbriqués dans des divs; donc votre inquiétude dans le commentaire de Lukas ne serait pas valable.
Ce que je pense que vous devez faire est de spécifier les attrs que vous voulez, tels que
la source
avez-vous essayé
soup.findAll("div", {"id": "articlebody"})
?cela semble fou, mais si vous récupérez des trucs de la nature, vous ne pouvez pas exclure plusieurs divs ...
la source
J'ai utilisé:
Comme ma syntaxe pour find / findall; Cela dit, à moins qu'il n'y ait d'autres paramètres optionnels entre la balise et la liste d'attributs, cela ne devrait pas être différent.
la source
Cela m'est arrivé aussi en essayant de gratter Google.
J'ai fini par utiliser pyquery.
Installer:
Utilisation:
la source
Voici un fragment de code
Comme vous pouvez le voir, je trouve toutes les balises, puis je trouve toutes les balises avec class = "article" à l'intérieur
la source
La
Id
propriété est toujours identifiée de manière unique. Cela signifie que vous pouvez l'utiliser directement sans même spécifier l'élément. Par conséquent, c'est un plus si vos éléments le permettent d'analyser le contenu.la source