2010-04-14 12 views
11

Ich möchte HTML mit Lxml mit XPath-Ausdrücken analysieren. Mein Problem ist passend für den Inhalt eines Tags:Wie finde ich den Inhalt eines Elements in XPath (lxml)?

Zum Beispiel mit dem

<a href="http://something">Example</a> 

Elemente ich das Attribut href

.//a[@href='http://something'] 

mit mithalten können, aber denen dem Ausdruck

.//a[.='Example'] 

oder sogar

.//a[contains(.,'Example')] 

lxml löst die Ausnahme 'ungültiges Knotenprädikat' aus.

Was mache ich falsch?

EDIT:

Beispielcode:

from lxml import etree 
from cStringIO import StringIO 

html = '<a href="http://something">Example</a>' 
parser = etree.HTMLParser() 
tree = etree.parse(StringIO(html), parser) 

print tree.find(".//a[text()='Example']").tag 

Erwartete Ausgabe ist 'a'. Ich erhalte 'Syntaxerror: invalid Knoten Prädikat'

+2

Anstatt StringIO zu verwenden, hätten Sie etree.fromstring() verwenden können, um Ihren HTML-Code zu parsen. –

Antwort

18

Ich würde versuchen, mit:

.//a[text()='Example']

xpath() -Methode:

tree.xpath(".//a[text()='Example']")[0].tag 

Wenn Falls Sie möchten iterfind() verwenden, Beachten Sie, dass erweiterte Funktionen wie Wertevergleich und Funktionen in ElementPath nicht verfügbar sind.

lxml.etree supports the simple path syntax of the find, findall and findtext methods on ElementTree and Element, as known from the original ElementTree library (ElementPath). As an lxml specific extension, these classes also provide an xpath() method that supports expressions in the complete XPath syntax, as well as custom extension functions.

+0

Ich möchte den Link nicht basierend auf href finden, sondern basierend auf dem darin enthaltenen Text: "Beispiel" im obigen Beispiel :) .//a[@href='http://irgendwas 'funktioniert So wie es ist ... – akosch

+1

müssen Sie ein entfernen = .//a[text()='Example '] – Greg

+0

Vielen Dank für Ihren Vorschlag, aber dieser wirft "SyntaxError: ungültige Knoten Prädikat" zu – akosch

Verwandte Themen