2012-06-15 17 views
5

jestem pewien kodowania Perl używać XPath zlokalizować konkretny td elementu w table`, która wygląda podobnie do tegowyrażenie XPath do umieszczenia elementu danego węzła tekstowego

<table> 
    <tr> 
     <td>...</td> 
     <td><font color="white" face="verdana, Helvetica, Arial" size="2">Showing <b>1</b>-<b>100</b> of <b>200</b> total</font></td> 
     <td>...</td> 
     <td>...</td> 
    </tr> 
    </table> 

Co chcę jest znalezienie td element z węzłem font/text(), który zawiera ciąg Showing.

mecze contains(., "Showing")

Bezpośrednie porównanie działa prawidłowo:

//td[font/text()="Showing "] 

ale chcę użyć funkcji XPath tak, że mecz jest bardziej elastyczny.

Próbowałem

//td[contains(font/text(), "Showing ")] 

ale tu pojawia się błąd

XPath failed due to: A sequence of more than one item is not allowed as the first argument of contains() 

i udało mi się osiągnąć to, co chcę z

//td[font/text()[contains(., "Showing")]] 

ale to jest bardzo brzydkie i ja Mam nadzieję na coś bardziej zwięzłego. Czy ktoś może poprawić to dla mnie, czy może potwierdzić, że jest to najlepszy i najbardziej zwięzły sposób?

+0

bardziej zwięzły? Masz ścieżkę xpath, która mówi "Wszystkie' td's, które mają 'font', którego tekst zawiera' Showing' "- co jest dokładnie twoim opisem problemu! - a chcesz, żeby było bardziej zwięzłe ?! – AakashM

+0

@AakashM: Tak, mam. Tylko dlatego, że jest to * jeden * sposób wyrażania tego, co chcę, nie oznacza, że ​​jest to najczystszy *. Nie muszę pisać '//td[font/text()[.="Pokazywanie"]], więc pomyślałem, że może istnieć sposób użycia 'zawiera' zamiast' = '. – Borodin

+1

Dlaczego więc uważasz, że wyrażenie jest "bardzo brzydkie"? To ta, której bym użył - a to oznacza, że ​​przynajmniej według mojej wiedzy nie ma bardziej eleganckiej. –

Odpowiedz

7

Spróbuj tego:

//td[contains(font/text()[1], 'Showing ')] 
+1

Dzięki Kirill. To działa, ale tylko wtedy, gdy jest to pierwszy dopasowany węzeł tekstowy. Chcę znaleźć 'td', gdzie dowolny' font/text() 'zawiera podany ciąg znaków. – Borodin

+0

@Borodin Masz na myśli to: '// td [zawiera (font/text(), 'pokazano')]? – toniedzwiedz

+0

@Borodin, Zgodnie ze specyfikacją XPath, jeśli argument nie jest typu 'string', jest on najpierw konwertowany na ciąg znaków za pomocą funkcji' string() ', a następnie obliczany jest wynik tej konwersji. Więc twój silnik XPath nie działa poprawnie. –

Powiązane problemy