Wie bekomme ich den kompletten Inhalt eines Knotens mit xpath & lxml?

Ich verwende die xpath-Funktion von lxml, um Teile einer Webseite abzurufen. Ich versuche, Inhalte eines <font> -Tags zu erhalten, das html-Tags enthält. Wenn ich benutze

 //td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"] 

Ich bekomme die richtige Menge an Knoten, aber sie werden als lxml-Objekte zurückgegeben ( <Element font at 0x101fe5eb0> ).

Wenn ich benutze

 //td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]/text() 

Ich bekomme genau das, was ich will, außer dass ich keinen HTML-Code bekomme, der in den <font> -Nodes enthalten ist.

Wenn ich benutze

 //td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]/node() 

Wenn eine Mischung aus Text und lxml Elemente! ( something something <Element a at 0x102ac2140> something )

Gibt es sowieso eine reine XPath-Abfrage, um den Inhalt der <font> -Nodes zu erhalten, oder sogar, um lxml zu zwingen, einen String des Inhalts aus der .xpath() -Methode zurückzugeben, anstatt ein lxml-Objekt?

Beachten Sie, dass ich eine Liste von vielen Knoten aus der XPath-Abfrage zurückgibt, damit die Lösung das unterstützen muss.

Nur um zu klären … ich möchte something something <a href="url">inside</a> something aus so etwas wie …

 <font face="verdana" color="#ffffff" size="2"><a href="url">inside</a> something</font> 

2 Solutions collect form web for “Wie bekomme ich den kompletten Inhalt eines Knotens mit xpath & lxml?”

Ich bin mir nicht sicher, ob ich das verstehe – ist das genau das, was du suchst?

 import lxml.etree as le import cStringIO content='''\ <font face="verdana" color="#ffffff" size="2"><a href="url">inside</a> something</font> ''' doc=le.parse(cStringIO.StringIO(content)) xpath='//font[@face="verdana" and @color="#ffffff" and @size="2"]/child::*' x=doc.xpath(xpath) print(map(le.tostring,x)) # ['<a href="url">inside</a> something'] 

Gibt es sowieso eine reine XPath-Abfrage, um den Inhalt der <font> -Nodes zu erhalten, oder sogar, um lxml zu zwingen, einen String des Inhalts aus der .xpath() -Methode zurückzugeben, anstatt ein lxml-Objekt?

Beachten Sie, dass ich eine Liste von vielen Knoten aus der XPath-Abfrage zurückgibt, damit die Lösung das unterstützen muss.

Nur um zu klären … ich möchte etwas zurückgeben <a href="url">inside</a> something aus so etwas wie …

 <font face="verdana" color="#ffffff" size="2"><a 

Href = "url"> in etwas

Kurze Antwort : Nr.

XPath funktioniert nicht an "tags" aber mit nodes

Die ausgewählten Knoten werden als Instanzen von bestimmten Objekten in der Sprache dargestellt, die XPath hostet.

Falls Sie die outerXML eines outerXML eines bestimmten Knotens benötigen, unterstützen diese Objekte typischerweise eine outerXML Eigenschaft – überprüfen Sie die Dokumentation der Hosting-Sprache (lxml in diesem Fall).

Als @ Robert-Rossney wies darauf hin, in seinem Kommentar: lxml's tostring() -Methode ist gleichbedeutend mit anderen Umgebungen ' outerXml Eigenschaft .

  • Python xml query erhalten übergeordnet
  • Wie kann XPath mehrere Tabellenelemente mit identischen ID-Attributen auswählen?
  • XPath: Tag mit leerem Wert auswählen
  • Brauchen Sie Hilfe bei Verwendung von XPath in ElementTree
  • Wie kann ich HTML mit html5lib analysieren und das geparste HTML mit XPath abfragen?
  • XPath wähle alle, aber nicht selbst :: stark und selbst :: stark / folgend-Geschwister :: Text ()
  • Python xpath funktioniert nicht?
  • Extrahieren von Just-Sibling-Element in xpath
  • Python XPath SyntaxError: ungültiges Prädikat
  • Entfernen von Leerzeichen und nicht bedruckbarem Zeichen in Python
  • OpenERP 7 Hinzufügen von Feld zu vorhandenem Modul - XML ​​Validate Error
  • Python ist die beste Programmiersprache der Welt.