Je veux obtenir toutes les <a>
balises 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 ceux <a>
qui sont enfants de <li class=test>
mais pas d'autres.
Comme je veux sélectionner:
<a>link1</a>
python
html
beautifulsoup
tej.tan
la source
la source
soup.find('li', {'class': 'text'}).findChildren()
.find(li).find(a).firstChild()
Il y a une très petite section dans les DOCs qui montre comment trouver / find_all enfants directs .
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-recursive-argument
Dans votre cas, comme vous le souhaitez, link1 qui est le premier enfant direct:
Si vous voulez tous les enfants directs:
la source
Tu veux peut-être faire
la source
<a> link2 </a>
aussi mais je ne veux pas ça<a>link1</a>
dans le HTML donné dans la question, mais cela échouera lorsque le premier<li class="test">
ne contiendra aucun<a>
élément et qu'il y a d'autresli
éléments avec latest
classe qui contient<a>
.essaye ça:
autres rappels:
La méthode find obtient uniquement le premier élément enfant qui se produit. La méthode find_all récupère tous les éléments descendants et sont stockés dans une liste.
la source
"Comment trouver tous ceux
a
qui sont enfants<li class=test>
mais pas d'autres?"Compte tenu du HTML ci-dessous (j'en ai ajouté un autre
<a>
pour montrer la différence entreselect
etselect_one
):La solution consiste à utiliser le combinateur enfant (
>
) placé entre deux sélecteurs CSS:Au cas où vous souhaiteriez ne trouver que le premier enfant:
la source
Encore une autre méthode - créez une fonction de filtre qui renvoie
True
pour toutes les balises souhaitées:Ensuite, appelez simplement
find_all
avec l'argument:la source