2013-09-23 12 views
6

Annunciare la mia analisi di una pagina web che include una struttura come questa:XPath: trovare cella di una tabella con la stessa posizione nella riga differente

<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> 

Che cosa devo fare è selezionare una voce basati su di esso di un'etichetta, quindi il mio pensiero è se l'etichetta è nel terzo tag nella sua riga, posso afferrare il terzo tag nella riga successiva per trovare l'oggetto. Non riesco a capire un modo per usare la funzione position() in questo modo, e forse xpath (1.0) non è in grado di gestire questo tipo di filtro.

Il mio tentativo migliore finora è: //td[ancestor::tr[1]/preceding-sibling::tr[1]/td[position()]]. Speravo che la funzione position() prendesse la posizione di <td> all'inizio di xpath, poiché il resto di xpath è un filtro per quel nodo.

È quello che sto cercando di fare anche possibile?

+2

Quale libreria/linguaggio di programmazione stai usando per eseguire gli XPath? Non penso che questo possa essere fatto in puro XPath 1.0, avresti bisogno di memorizzare 'position()' dal contesto esterno in una variabile e poi usare quella variabile all'interno del predicato, e il modo in cui imposti le variabili varia dallo strumento a strumento. –

+0

Utilizzo un web driver al selenio. – eldon111

+0

Quali associazioni di lingua selenio-webdriver usi? È più facile usare vari metodi di selenio piuttosto che una pura soluzione xpath. –

risposta

5

Sei sulla buona strada - sì, è possibile utilizzare position() insieme a count().

Per selezionare il testo Item 2 data Label 2:

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

Spiegazione: Selezionare la cella ennesima dove n è dato per il numero di pari livello cellule che esiste prima che la cella che ha desiderato etichetta nella riga precedente. In effetti, utilizzare la funzione count() per determinare la posizione nella riga dell'etichetta e quindi selezionare la cella corrispondente nella riga successiva abbinata rispetto alla sua position().

+0

Il problema è che ho bisogno di prendere l'oggetto corrispondente dal tag '' adiacente. Come per "Etichetta 2", restituire "Articolo 2". – eldon111

+0

Ah, è un po 'più difficile ma anche fattibile. Vedi risposta aggiornata sopra. – kjhughes

Problemi correlati