webentwicklung-frage-antwort-db.com.de

So finden Sie mit BeautifulSoup Kinder von Knoten

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>
91
tej.tan

Versuche dies

li = soup.find('li', {'class': 'text'})
children = li.findChildren("a" , recursive=False)
for child in children:
    print child
94
cerberos

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)
104
bitstrider

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.

12
kiiru

Vielleicht möchten Sie das tun

soup.find("li", { "class" : "test" }).find('a')
11
Bemmu

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
6
Dedek Mraz

"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>
5
Jatimir