XML Etree und lxml : Probleme mit Xpath-Suchen
Verfasst: Dienstag 9. November 2021, 14:28
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 < oder > 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>
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 < oder > 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>