1
votes

Filtrage des éléments
parents en fonction des éléments enfants internes [Python]

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".


0 commentaires

3 Réponses :


1
votes

On dirait que xpath fonctionnerait. Quelque chose comme

//p[contains(@class, 'example') and normalize-space(text()) = 'TRUE']/ancestor::div[@class='parent']


2 commentaires

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']



0
votes

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')


0 commentaires

0
votes

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>


0 commentaires