Chcę uzyskać wszystkie <a>
tagi, które są elementami podrzędnymi <li>
:
<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
</li>
</div>
Wiem, jak znaleźć element z taką klasą:
soup.find("li", { "class" : "test" })
Ale nie wiem, jak znaleźć wszystkie <a>
dzieci, <li class=test>
ale nie inne.
Tak jak chcę wybrać:
<a>link1</a>
python
html
beautifulsoup
tej.tan
źródło
źródło
soup.find('li', {'class': 'text'}).findChildren()
.find(li).find(a).firstChild()
W DOCs znajduje się bardzo mała sekcja, która pokazuje, jak znaleźć / find_all bezpośrednie dzieci.
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-recursive-argument
W twoim przypadku, jak chcesz, link1, który jest pierwszym bezpośrednim dzieckiem:
Jeśli chcesz, aby wszystkie bezpośrednie dzieci:
źródło
Być może chcesz to zrobić
źródło
<a> link2 </a>
ale nie chcę tego<a>link1</a>
w HTML podanym w pytaniu, ale to się nie powiedzie, gdy pierwszy nie<li class="test">
będzie zawierał żadnych<a>
elementów i są inneli
elementy ztest
klasą, która zawiera<a>
.Spróbuj tego:
inne przypomnienia:
Metoda find pobiera tylko pierwszy występujący element potomny. Metoda find_all pobiera wszystkie elementy podrzędne i są przechowywane na liście.
źródło
"Jak znaleźć wszystkie
a
dzieci,<li class=test>
ale innych nie?"Biorąc pod uwagę poniższy kod HTML (dodałem kolejny,
<a>
aby pokazać różnicę międzyselect
iselect_one
):Rozwiązaniem jest użycie kombinatora potomnego (
>
), który jest umieszczony między dwoma selektorami CSS:Jeśli chcesz znaleźć tylko pierwsze dziecko:
źródło
Jeszcze inna metoda - utwórz funkcję filtrującą, która zwraca
True
dla wszystkich pożądanych tagów:Następnie po prostu zadzwoń
find_all
z argumentem:źródło