2012-03-10 15 views
8

Mam nadzieję, że ktoś tam szybko wskaże mi właściwy kierunek z moimi trudnościami XPath.XPath, aby zlokalizować komórkę z tekstowym parsowaniem tabel HTML

Obecny Doszedłem do punktu, w którym identyfikuję poprawną tabelę potrzebną w moim źródle HTML, ale muszę przetworzyć tylko te wiersze, które mają tekst "Rozdział" gdzieś w DOM.

Moja ostatnia próba była to zrobić:

// get the correct table 
HtmlTable table = page.getFirstByXPath("//table[2]"); 

// now the failing bit.... 
def rows = table.getByXPath("*/td[contains(text(),'Chapter')]") 

Myślałem, że XPath powyżej stanowiłoby, daj mi wszystkie elementy, które mają następujący element podrzędny „TD”, że gdzieś w jego dom zawiera tekst " Rozdział”

przykładem rzędzie pasującym od mojego źródła jest:

<tr valign="top"> 
    <td nowrap="" align="Right"> 
    <font face="Verdana"> 
    <a href="index.cfm?a=1">Chapter 1</a> 
    </font> 
    </td> 
    <td class="ChapterT"> 
    <font face="Verdana">DEFINITIONS</font> 
    </td> 
    <td>&nbsp;</td> 
</tr> 

Każda pomoc/wskazówki mile widziana.

Dzięki,

Odpowiedz

12

Używaj tego XPath:

//td[contains(., 'Chapter')] 
+0

Dzięki, że wydaje się działać. Co oznacza "." przedstawiać? Ponadto nie rozumiem, dlaczego detekcja "relacyjna" nie działa, np. masz // który, jak rozumiem, zaczyna się od rdzenia? – Dave

+0

@Dave, Nie ma za co. '.' i' // 'to skrócona składnia XPath. '.' wybiera węzeł kontekstu. '// td' wybiera wszystkich potomków td' z głównego katalogu dokumentów i tym samym wybiera wszystkie elementy' td' w tym samym dokumencie, co węzeł kontekstu. * Numer referencyjny *: http://www.w3.org/TR/xpath/#path-abbrev –

2

Twoja na właściwej "ścieżce".
Funkcja contains() jest ograniczona konkretnym elementem, a nie tekstem w żadnym z elementów podrzędnych. Spróbuj tego XPath, które można odczytać w następujący sposób: - dostać każdy tr/td z każdej sub elementu, który zawiera tekst 'dział'

tr/td[contains(*,"Chapter")] 

Powodzenia

+0

Hi William, dał mu szansę, ale nie mógł dostać to zwrócić wszystko. To, co zadziałało, choć nie wydaje się najskuteczniejsze, to pojedyncza linijka " def chapterAnchors = page.anchors.findAll {HtmlAnchor a -> a.asText(). Zawiera (" Rozdział ")} ' – Dave

7

chcesz wszystkie td s pod bieżącego węzła - nie - wszystkim w dokumenciejak aktualnie akceptowanych odpowiedź se lects.

Zastosowanie:

.//td[.//text()[contains(., 'Chapter')]] 

Wybiera wszystkie td potomków bieżącego węzła, które są o nazwie td które mają co najmniej jeden potomek węzła tekstu, którego wartość zawiera ciąg ciąg "Chapter".

Jeśli wiadomo z góry, że każdy td pod tym table ma tylko jeden węzeł tekstowy, to może być uproszczone do zaledwie:

.//td[contains(., 'Chapter')] 
Powiązane problemy