2017-06-24 2 views
2

Ich benutze Lxml, um eine bestimmte Seite zu kratzen. Ich weiß, wie man ein Tag per ID abfängt, konnte aber nicht herausfinden, wie man die eigentlichen ID-Attribute erfasst.Wie bekomme ich IDs aller Kinder eines Div

Zum Beispiel sagt die html ist:

<div id="stuff" > 
    <div id="some unknown"> xxxx </div> 
    <div id="another unknown"> xxxxx </div> 
</div> 

Wie erhalte ich eine Liste

['some unknown', 'another unknown'] 

Gibt es eine Möglichkeit, dies zu tun speziell mit XPath?

+0

Was xpath haben Sie versucht? –

+0

ehrlich gesagt nicht sicher, wie man das angehen soll. Ich habe versucht 'root.xpath ('// * [@ id =" stuff "]/div /')' zu bekommen, die divs selbst – Abe

Antwort

1

Wenn Sie die id s der direkten Kinder möchten, können Sie die folgende XPath-Abfrage verwenden:

#          v obtain id attribute 
document.xpath('//*[@id="stuff"]/*[@id]/@id') 
#    ^#stuff tag ^child with id attribute 

Hier haben wir also den ersten Blick für eine <* id="stuff"> Tag, dann sind wir für die direkte Kinder kümmern (any Tag), die eine @id haben und wir nehmen die @id von diesen.

Dies wird eine Liste der Elemente lxml.etree._ElementUnicodeResult zurückgeben. Wir können jedoch str(..) verwenden den String-Wert zu erhalten:

[str(the_id) for the_id in document.xpath('//*[@id="stuff"]/*[@id]/@id')] 

Beachten Sie, dass wir hier die Betreuung des Kindes über die Art beachten Sie. Wenn Sie nur die id s von <div> Kinder wollen, können Sie verwenden:

#           v obtain id attribute 
document.xpath('//*[@id="stuff"]/div[@id]/@id') 
#    ^#stuff tag ^child with id attribute 

Falls suchen Sie alle Nachkommen, müssen Sie einfach einen zusätzlichen Schrägstrich zwischen der @id="stuff" Abfrage und die Kinder hinzuzufügen:

+0

Danke für die sehr detaillierte Antwort, ich werde es ausprobieren - bearbeiten - es funktioniert! – Abe

Verwandte Themen