2010-05-03 5 views
19

Ich verwende Konstruktion wie folgt aus:Wie verwende ich regulären Ausdruck in Lxml XPath?

doc = parse(url).getroot() 
links = doc.xpath("//a[text()='some text']") 

Aber ich brauche alle Links zu wählen, die Text mit „etwas Text“ ab, so dass ich mich frage, ist es eine Möglichkeit, regexp hier zu benutzen? Es wurde leider nichts in lxml Dokumentation

Antwort

32

Sie können dies tun (auch wenn Sie keine regulären Ausdrücke für das Beispiel brauchen). Lxml unterstützt reguläre Ausdrücke aus den Erweiterungsfunktionen EXSLT. (Siehe lxml docs für die XPath class, aber es funktioniert auch für die xpath() Methode)

doc.xpath("//a[re:match(text(), 'some text')]", 
     namespaces={"re": "http://exslt.org/regular-expressions"}) 

Beachten Sie, dass Sie benötigen das Namespace-Mapping zu geben, damit er weiß, was die „re“ Präfix in der XPath-Ausdruck steht zum.

+1

Nicht für mich funktioniert, ich: 'match (., 'Ein wenig Text')'. Übrigens verstehe ich den '.' Teil nicht ganz. Und func 'test' hat das gleiche Ergebnis (ich denke, es macht mehr Sinn,' test' tatsächlich zu verwenden: P) – lajarre

+1

Funktioniert auch nicht für mich. – Luke

+0

[siehe diese] (http://stackoverflow.com/a/17293795/786559), wenn Sie es leid sind, die Namespaces zu passieren –

15

können Sie die starts-with() Funktion:

doc.xpath("//a[starts-with(text(),'some text')]")