XPath-Ausdruck, um substrings zu bestimmen

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich bin noch mit lxml am basteln. Aus diesem HTML möchte ich gerne die IDs ohne Präfix extrahieren:

Code: Alles auswählen

from lxml import html
doc = html.fromstring('<html><a id="x_1"/><a id="x_2"/></html>')
print doc.xpath("//a/@id") #=> ['x_1', 'x_2']
Geht das irgendwie? Mit `substring(//a/@id, 3)` bekomme ich leider nur das erste und nicht alle Ergebnisse zurück. Und mit `//a/substring(@id, 3)` treffe ich leider nicht die richtige Syntax.

Stefan
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Nichts gegen XPath, aber kannst Du das nicht später mit Bordmitteln erledigen? Man muss ja nicht immer alles gleich mit einer Technologie erschlagen. Leider kenne ich mich mit XPath nicht gut genug aus, um Dir da direkt weiterzuhelfen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

@sma: Mit XPath 2.0 funktioniert "//a/@id/substring(., 2)" oder "//a/@id/substring-after(., 'x_')". In XPath 1.0 gibt es keine direkte Möglichkeit, Funktionen auf alle Knoten einer Menge anzuwenden. Da libxml und somit auch lxml nur XPath 1.0 beherrscht, musst Du Dir in diesem Fall mit den Mittel von Python helfen:

Code: Alles auswählen

print [s[2:] for s in doc.xpath('//a/@id')]
Was meines Erachtens auch die schönere, weil verständlichere Lösung ist. XPath leistet als Abfragesprache zweifelsohne gute Dienste, aber dabei sollte man es auch belassen.
Antworten