Ich bin neu in der Verwendung von Xpath. Ich versuche, einige Daten in Python mit Xpath zu analysieren.Xpath folgende Geschwister bis zu einem anderen Geschwister
Parsen der folgende HTML:
<table>
<tr>
<td class="DT">29-04-14</td>
<td class="Regio">Text</td>
<td class="Md">Text</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="SomeClass">Some other text</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="SomeOtherClass">Some more text</td>
</tr>
<tr>
<td class="DT">22-04-14</td>
<td class="Regio">Text</td>
<td class="Md">Text</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="OmsAm">more text</td>
</tr>
<tr>
<td class="DT">30-04-14</td>
<td class="Regio">Text</td>
<td class="Md">Text</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="OmsBr">Some other Text</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="OmsBr">More Text</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="OmsBr">Some different text</td>
</tr>
</table>
Ich brauche alle <td>
in folgenden Geschwister <tr>
nach einem <tr>
mit einigen Werten in seiner <td>
s, aber bis die nächste <tr>
mit einigen Werten in allen <td>
s.
z. meine aktuelle Position einnimmt, wird die erste <tr>
, würde ich diese Tabellenzellen benötigt:
<td class="SomeClass">Some other text</td>
<td class="SomeOtherClass">Some more text</td>
meine aktuelle Position Angenommen wird, um die Tabellenzeile 4
<tr>
<td class="DT">22-04-14</td>
<td class="Regio">Text</td>
<td class="Md">Text</td>
</tr>
ich nur
<td class="OmsAm">more text</td>
brauchen würde
Dies ist der Xpath, den ich benutze, um alle Geschwister zu bekommen <tr>
, aber es bringt mich alle Follinwg Geschwister, und nicht Sie bis das Geschwister sollte es aufhören: ./following-sibling::tr/td[1][not(text()[1])]/..
Ich denke, ich muss die Kayesian Methode implementieren, aber ich verstehe das nicht in meinem Fall. Jede Hilfe würde wirklich geschätzt werden!
ich nicht ernst 'Ich brauche alle
Bitte zeigen Sie Ihren Python-Code. Ein XPath-Ausdruck, der dieses Problem löst, ist langatmig. Stattdessen sollten Sie einen relativ einfachen XPath-Ausdruck schreiben und die Ergebnisse dann mit Python verarbeiten. –
Möchten Sie die '
Antwort
ich die Frage werden, falsch interpretiert, aber wenn, für jede
<tr><td class="DT">xx-xx-xx</td>
, möchten Sie alle<tr>
danach, und vor dem nächsten<tr><td class="DT">xx-xx-xx</td>
, ein Muster, ist eine Schleife auf diese „Grenze“<tr><td class="DT">xx-xx-xx</td>
Elemente und Auswählen folgenden Geschwisterreihen mit eine Bedingung, wie viele "Grenzen" zuvor gefunden wurden.Lassen Sie uns
lxml
verwenden, um zu veranschaulichen. Erstens haben wir ein Dokument von Ihrem Abtastwerteingang erstellen:Nun lassen Sie uns zählen diese
<tr><td class="DT">xx-xx-xx</td>
:Wir können auf diesen Reihen Schleife und die Zeilen auswählen, die nach dem in dem Dokument (wir kommen ‚ll Textknoten auswählen zu‚sehen‘, welche Zeile diese sind:
Wir Auswahl zu viele Zeilen in jeder Iteration alle Zeilen bis zum Ende des
<table>
. Wir benötigen eine zusätzliche "Ende" -Bedingung für die folgenden Zeilen.Wir sind die
tr[td/@class="DT"]
in der Schleife zu zählen, so können wir überprüfen, wie viele vorhergehendentr[td/@class="DT"]
jede Zeile hat:Für den 1. Satz:
Für die 2.:
usw.
Also, in der Schleife, können wir die aktuelle Zählung mit einem XPath-Variable mit lxml (an underrated XPath feature supported by lxml) verwenden:
Hm, wir dir 1 Zeile zu viel in jeder Iteration.
Das ist, weil
<tr><td class="DT">30-04-14</td>
auch 1<tr><td class="DT">
vorhergehenden hatWir können ein zusätzliches Prädikat hinzufügen zum Auswählen von Zeilen, die ein Recht sieht
<td class="DT">
Die Anzahl der Ergebnisse pro Iteration nicht haben. Lassen Sie uns schließlich Textknoten mit überprüfen:
Quelle
2016-07-07 09:05:05
Wow, tolle Erklärung und funktioniert perfekt! Danke vielmals! – Gino
Verwandte Themen