186 votes

Comment trouver les enfants des nœuds en utilisant BeautifulSoup

Je veux obtenir tous les <a> qui sont des enfants de <li> :

<div>
<li class="test">
    <a>link1</a>
    <ul> 
       <li>  
          <a>link2</a> 
       </li>
    </ul>
</li>
</div>

Je sais comment trouver un élément avec une classe particulière comme celle-ci :

soup.find("li", { "class" : "test" }) 

Mais je ne sais pas comment trouver tous les <a> qui sont des enfants de <li class=test> mais pas d'autres.

Comme je veux sélectionner :

<a>link1</a>

8voto

Dedek Mraz Points 657

Encore une autre méthode - créer une fonction de filtre qui renvoie True pour toutes les étiquettes souhaitées :

def my_filter(tag):
    return (tag.name == 'a' and
        tag.parent.name == 'li' and
        'test' in tag.parent['class'])

Alors appelez simplement find_all avec l'argument :

for a in soup(my_filter): # or soup.find_all(my_filter)
    print a

8voto

jerry_ Points 41

Je viens de tomber sur cette réponse et j'ai vérifié la documentation pour voir que soup.findChildren est déprécié (BS 4.9). Vous pouvez utiliser soup.children à la place, qui ne prend en compte que les enfants directs d'un élément, et non ses descendants.

li = soup.find('li', {'class': 'text'})
for child in li.children:
    print(child)

Documentation : https://www.crummy.com/software/BeautifulSoup/bs4/doc/#contents-and-children

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X