2013-09-23 10 views
6

ich eine Webseite bin Parsen, die eine Struktur wie folgt enthält:XPath: Tabellenzelle mit dem gleichen Position in verschiedenen Reihen finden

<tr> 
    <td>Label 1</td> 
    <td>Label 2</td> 
    <td>Label 3</td> 
    <td>Something else</td> 
<\tr> 
<tr> 
    <td>Item 1</td> 
    <td>Item 2</td> 
    <td>Item 3</td> 
<\tr> 

Was ich tun müssen, um ein Element auszuwählen basierend auf ihrem Label, so meinen Gedanken Ist das Label im dritten Tag in der Zeile, kann ich das dritte Tag in der nächsten Zeile auswählen, um das Element zu finden. Ich kann keine Möglichkeit finden, die Funktion position() auf diese Weise zu verwenden, und vielleicht kann xpath (1.0) diese Art der Filterung nicht verarbeiten.

Mein bisher bester Versuch ist: //td[ancestor::tr[1]/preceding-sibling::tr[1]/td[position()]]. Ich hatte gehofft, dass die position() - Funktion die Position des <td> am Anfang des xpaths einnimmt, da der Rest des xpath ein Filter für diesen Knoten ist.

Ist was ich versuche zu tun, sogar möglich?

+2

Welche Bibliothek/Programmiersprache verwenden Sie zur Ausführung Ihrer XPaths? Ich glaube nicht, dass dies in reinem XPath 1.0 möglich ist, Sie müssten das 'position()' aus dem äußeren Kontext in einer Variablen speichern und dann diese Variable innerhalb des Prädikats verwenden, und wie Sie Variablen setzen, variiert von Werkzeug zu Werkzeug. –

+0

Ich verwende Selen-Webdriver. – eldon111

+0

Welche Selen-Webdriver-Sprachbindungen verwenden Sie? Es ist wahrscheinlich einfacher, verschiedene Selenmethoden anstelle einer reinen Xpath-Lösung zu verwenden. –

Antwort

5

Sie sind auf dem richtigen Weg - ja, Sie können position() zusammen mit count() verwenden.

den Text auszuwählen Item 2 gegebenen Label 2:

//td[. = 'Label 2']/../following-sibling::tr/td[position() = count(//td[. = 'Label 2']/preceding-sibling::td)+1]/text() 

Erläuterung: die Zelle nth Wählen wo n durch die Anzahl der Geschwisterzellen gegeben ist, die vor der Zelle vorhanden sind, die die gewünschte hat Etikett in der vorherigen Zeile. Verwenden Sie die Funktion count(), um die Position in der Etikettenzeile zu bestimmen, und wählen Sie dann die entsprechende Zelle in der nächsten Zeile aus, indem Sie sie mit ihrer position() vergleichen.

+0

Das Problem ist, ich muss das entsprechende Element aus dem benachbarten '' Tag greifen. Wie bei "Label 2", gib "Item 2" zurück. – eldon111

+0

Ah, das ist ein bisschen schwieriger aber auch machbar. Siehe aktualisierte Antwort oben. – kjhughes

Verwandte Themen