Ich möchte alle <a>
Tags erhalten, die Kinder von <li>
Sind:
<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
</li>
</div>
Ich weiß, wie man ein Element mit einer bestimmten Klasse wie dieser findet:
soup.find("li", { "class" : "test" })
Aber ich kann nicht alle <a>
Finden, die Kinder von <li class=test>
Sind, aber keine anderen.
Gerne möchte ich auswählen:
<a>link1</a>
Versuche dies
li = soup.find('li', {'class': 'text'})
children = li.findChildren("a" , recursive=False)
for child in children:
print child
Es gibt einen sehr kleinen Abschnitt in den DOCs, der zeigt, wie man/find_all direkte Kinder findet.
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-recursive-argument
In Ihrem Fall, wie Sie wollen, ist link1 das erste direkte Kind:
# for only first direct child
soup.find("li", { "class" : "test" }).find("a", recursive=False)
Wenn Sie alle direkten Kinder wollen:
# for all direct children
soup.find("li", { "class" : "test" }).findAll("a", recursive=False)
versuche dies:
li = soup.find("li", { "class" : "test" })
children = li.find_all("a") # returns a list of all <a> children of li
andere Erinnerungen:
Die find-Methode ruft nur das erste vorkommende untergeordnete Element ab. Die find_all-Methode ruft alle untergeordneten Elemente ab und wird in einer Liste gespeichert.
Vielleicht möchten Sie das tun
soup.find("li", { "class" : "test" }).find('a')
Noch eine andere Methode - erstelle eine Filterfunktion, die True
für alle gewünschten Tags zurückgibt:
def my_filter(tag):
return (tag.name == 'a' and
tag.parent.name == 'li' and
'test' in tag.parent['class'])
Dann rufen Sie einfach find_all
mit dem Argument:
for a in soup(my_filter): # or soup.find_all(my_filter)
print a
"Wie finde ich alle a
, die Kinder von <li class=test>
Sind, aber keine anderen?"
In Anbetracht des folgenden HTML-Codes (ich habe einen weiteren <a>
Hinzugefügt, um den Unterschied zwischen select
und select_one
Anzuzeigen):
<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
<a>link3</a>
</li>
</div>
Die Lösung besteht darin, ntergeordneter Kombinator (>
) Zwischen zwei CSS-Selektoren zu verwenden:
>>> soup.select('li.test > a')
[<a>link1</a>, <a>link3</a>]
Falls Sie nur das erste Kind finden möchten:
>>> soup.select_one('li.test > a')
<a>link1</a>