2013-09-23 7 views
6

ja parsowania stronę internetową, która zawiera strukturę takiego:XPath: znaleźć komórkę tabeli z tej samej pozycji w innym wierszu

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

Co muszę zrobić, to wybrać element oparty na jego etykiecie, więc moja myśl jeśli etykieta znajduje się w trzecim znaczniku w rzędzie, mogę pobrać trzeci znacznik w następnym wierszu, aby znaleźć przedmiot. Nie mogę znaleźć sposobu na użycie funkcji position() w ten sposób, a być może xpath (1.0) nie jest w stanie obsłużyć tego typu filtrowania.

Moja jak dotąd najlepsza próba to: //td[ancestor::tr[1]/preceding-sibling::tr[1]/td[position()]]. Miałem nadzieję, że funkcja position() pobierze pozycję <td> na początku ścieżki xpath, ponieważ reszta ścieżki xpath jest filtrem dla tego węzła.

Czy to, co próbuję zrobić, nawet możliwe?

+2

Jakiej biblioteki/języka programowania używasz do wykonywania XPath? Nie sądzę, że można to zrobić w czystej wersji XPath 1.0, musisz zapisać 'position()' z zewnętrznego kontekstu w zmiennej, a następnie użyć tej zmiennej wewnątrz predykatu, a sposób ustawiania zmiennych zależy od narzędzia do narzędzia. –

+0

Używam selenium webdriver. – eldon111

+0

Jakie połączenia językowe selenium-webdriver używasz? Prawdopodobnie łatwiej jest korzystać z różnych metod selenowych niż z czystego rozwiązania xpath. –

Odpowiedz

5

Jesteś na dobrej drodze - tak, możesz użyć position() wraz z count().

Aby wybrać tekst Item 2 podane Label 2:

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

wyjaśnienie: wybrać komórkę nta gdzie n jest określona przez liczbę rodzeństwa komórek, które istniały przed komórki, która posiada pożądaną etykieta w poprzednim wierszu. W efekcie użyj funkcji count(), aby określić pozycję w rzędzie etykiet, a następnie wybierz odpowiednią komórkę w następnym rzędzie, dopasowując ją do jej position().

+0

Problem polega na tym, że muszę pobrać odpowiedni element z sąsiedniego znacznika ''. Podobnie jak w przypadku "Label 2", zwróć "Element 2". – eldon111

+0

Ah, to trochę trudniejsze, ale również wykonalne. Zobacz zaktualizowaną odpowiedź powyżej. – kjhughes

Powiązane problemy