J'ai un magnifique ensemble de résultats d'éléments de soupe qui contient plusieurs éléments parents, chacun contenant des éléments internes. Comment pourrais-je essayer de filtrer ces éléments en fonction du texte de chaque élément interne.
<div class="parent"> <div> ... <div> <p class="example"> TRUE </p> </div>
Dans l'exemple, disons que je veux conserver uniquement les éléments qui ont un élément p interne qui a un valeur de "TRUE".
3 Réponses :
On dirait que xpath fonctionnerait. Quelque chose comme
//p[contains(@class, 'example') and normalize-space(text()) = 'TRUE']/ancestor::div[@class='parent']
Donc, si, par exemple, je stocke à l'origine tous les éléments parents non filtrés dans "résultats". À quoi ressemblerait cette requête sur cette variable?
Je reçois également une erreur de syntaxe indiquant "parent" à ancêtre :: div [@ class = 'parent']
BeautifulSoup vous permet de donner une fonction comme filtre .
Vous pourriez donner un expression lambda comme
[<div class="parent"> <p class="example"> TRUE </p> </div>, <div class="parent"> <p class="example"> TRUE </p> </div>]
dans find_all () . Si l'enfant avec le texte n'est pas disponible, cela renverra une liste vide. Depuis toute séquence vide est considérée comme fausse en python, cela filtrera les éléments indésirables.
html=""" <div class="parent"> <p class="example"> TRUE </p> </div> <div class="parent"> <p class="example"> TRUE </p> </div> <div class="parent"> <p class="example">FALSE </p> </div> """ from bs4 import BeautifulSoup,Tag import re soup=BeautifulSoup(html,'html.parser') print(soup.find_all(lambda elem:elem.find('p',text=re.compile('TRUE'))))
Sorties:
lambda elem:elem.find('p',text=re.compile('TRUE')
Vous pouvez en fait le faire en utilisant les sélecteurs CSS dans BeautifulSoup 4.7+.
Ici, nous allons cibler chaque div
qui a un enfant direct / immédiat p
avec la classe exemple contenant le texte TRUE
.
[<div class="parent"> <p class="example"> TRUE </p> </div>, <div class="parent"> <p class="example"> TRUE </p> </div>]
Output
from bs4 import BeautifulSoup,Tag html=""" <div class="parent"> <p class="example"> TRUE </p> </div> <div class="parent"> <p class="example"> TRUE </p> </div> <div class="parent"> <p class="example">FALSE </p> </div> """ soup=BeautifulSoup(html,'html.parser') print(soup.select('div:has(> p.example:contains(TRUE))'))
p>