Seite 1 von 1

XML Etree und lxml : Probleme mit Xpath-Suchen

Verfasst: Dienstag 9. November 2021, 14:28
von Betzefreund
Hallo allerseits,

ich bin relativ neu in der Python-Gemeinde und war bislang sehr angetan von Python, weil es sich leicht erlernen lässt und gute Ergebnisse liefert. Jetzt habe ich aber einen kniffligen Fall, wo ich mit Bordmitteln nicht mehr weiter komme:

Ich will in einem XML-Dokument eine Xpath-Suche mit einem Prädikat machen, das einen Größer- bzw. Kleiner-Vergleich anstellt. Das XML-Dokument steht unten.
Die folgenden beiden Suchkommandos liefern aber kein Ergebnis:

orbNo = tree.findall(".//paragr[ol>1211]" )
orbNo = tree.findall(".//paragr[ol<1211]" )

Es hilft auch nicht, wenn ich das Suchkriterium in einfache Anführungszeichen setze. Der Trick mit HTML &lt; oder &gt; statt < bzw. > funktioniert auch nicht.

Nur eine Suchanfrage auf Gleichheit, also z. B.
orbNo = tree.findall(".//paragr[ol='1211']" )
liefert etwas, aber das ist ja nicht mal die halbe Miete .. .

Es ist auch egal, welche Bibliothek ich verwende ( Etree oder lxml ), beide liefern bei Suchen mit > und < nichts.

Zum Vergleich: Sowohl Java als auch PHP können mit diesen Operatoren arbeiten und liefern im gleichen Beispiel auch das erwartete Ergebnis ab.

Mache ich hier in der Xpath-Syntax etwas falsch oder ist das wirklich ein Defizit in der Xpath-Implementierung von Python?










<html charset="utf-8">
<body>
<h1 id="head2">Überschrift 1
<paragr id="p2" class="Name" >Friedenstr</paragr>
<paragr id="p2" class="Hausnummer" >11
<paragr id="p3" style="font-size:x-big;">1</paragr>
<paragr id="p4" >12
<ol id="ol1">1211</ol>
<ol id="ol2">1212</ol>
<ol id="ol3">1213</ol>
</paragr>

</paragr>
</h1>

<h1 id="head1">Überschrift 2
<paragr id="p1" class="Name" >Gollierstr</paragr>
<paragr id="p2" class="Hausnummer" >12
<paragr id="p3" style="font-size:x-big;">1</paragr>
<paragr id="p5" >12
<ol id="ol4">1214</ol>
<ol id="ol5">1215</ol>
<ol id="ol6">1216</ol>
</paragr>

</paragr>
</h1>

<h1 id="head3">Überschrift 3
<paragr id="p6" class="Name" >Los Angeles Avenue</paragr>
<paragr id="p7" class="Hausnummer" >32000
<paragr id="p8" style="font-size:x-big;">1</paragr>
<paragr id="p9" >12
<ol id="ol7">1217</ol>
<ol id="ol8">1218</ol>
<ol id="ol9">1219</ol>
</paragr>

</paragr>
</h1>

<h1 id="head4">Überschrift 4
<paragr id="p10" class="Name" >Landsberger Str.</paragr>
<paragr id="p11" class="Hausnummer" >256
<paragr id="p12" style="font-size:x-big;">1</paragr>
<paragr id="p13" >12
<ol id="ol10">1220</ol>
<ol id="ol11">1221</ol>
<ol id="ol12">1222</ol>
</paragr>

</paragr>
</h1>

</body>

</html>

Re: XML Etree und lxml : Probleme mit Xpath-Suchen

Verfasst: Dienstag 9. November 2021, 14:53
von __deets__
Meine XML/XPath-Zeiten sind laaaaaange her (ich habe sogar mal eine XPath-Engine programmiert. Und fast komplett vergessen...). Aber wenn ich mir das hier anschaue: https://www.data2type.de/xml-xslt-xslfo ... te/compare, dann steht da XPath Vesion 2.0. Und auf der lxml -Seite steht, dass es XPath 1.0 unterstuezt. Das klingt also erstmal schluessig fuer mich, dass das nicht geht. Mit Python hat das auch an sich eher weniger zu tun, das ist ja einfach libxml2, das da gewrappt wird.

Du kannst natuerlich in Python das Praedikat trivial nachruesten (durch nachtraegliches Filtern), oder schauen, ob du eine Funktion in den Interpreter injiziert bekommst: https://lxml.de/1.3/extensions.html

Re: XML Etree und lxml : Probleme mit Xpath-Suchen

Verfasst: Dienstag 9. November 2021, 16:25
von __blackjack__
@Betzefreund: Kann ich nicht nachvollziehen, `lxml` liefert Ergebnisse:

Code: Alles auswählen

In [14]: d = lxml.etree.parse('test.xml')                                       

In [15]: d.xpath(".//paragr[ol>1211]")                                          
Out[15]: 
[<Element paragr at 0x7f2527ea5948>,
 <Element paragr at 0x7f2526393288>,
 <Element paragr at 0x7f2527f73588>,
 <Element paragr at 0x7f25263957c8>]

In [16]: d.xpath(".//paragr[ol<1211]")                                          
Out[16]: []
Wobei ich da vorsichtig wäre was die ”Zahlen” anbetrifft, denn ich vermute mal ganz stark, dass sich die Vergleichsoperationen hier auf Zeichenketten beziehen, also "10" kleiner ist als "2".

Re: XML Etree und lxml : Probleme mit Xpath-Suchen

Verfasst: Mittwoch 10. November 2021, 11:10
von Betzefreund
Hallo,

habe das heute mal ausprobiert und muss gestehen: Chapeau! Chapeau!
Klappt alles einwandfrei und nicht nur bei lexikalischen Vergleichsoperationen. Ich habe jetzt auch erkannt, was ich "falsch" gemacht habe:

Ich kannte die Funktion d.xpath(...) nicht, statdessen habe ich immer d.findall(...) benutzt, in dem Glauben, das sei die Xpath-Implementierung von Python. Kann man beim Aufrufformat ja auch erstmal glauben, stimmt aber wohl nur halb.

Fazit: Muss wohl in Zukunft in der Python-Dokumentation noch mehr das Kleingedruckte lesen ...

Jedenfalls besten Dank, bis zum nächsten Problem!