Как получить значение внутри тега ‹td› с помощью xpath/htmlwebunit

Я пытаюсь создать приложение Java, которое извлекает информацию с веб-страницы. Это часть кода, в котором я пытаюсь получить доступ к значению в 1-м теге td во 2-м теге tr:

<TABLE  CLASS="datadisplaytable" width = "100%">
<TR>
    <TD CLASS="dddead">&nbsp;</TD>
    <TH CLASS="ddheader" scope="col" ><SPAN class="fieldlabeltext">Capacity</SPAN></TH>
    <TH CLASS="ddheader" scope="col" ><SPAN class="fieldlabeltext">Actual</SPAN></TH>
    <TH CLASS="ddheader" scope="col" ><SPAN class="fieldlabeltext">Remaining</SPAN></TH>
</TR> 
<TR>
    <TH CLASS="ddlabel" scope="row" ><SPAN class="fieldlabeltext">Seats</SPAN></TH>
    **<TD CLASS="dddefault">46</TD>**
    <TD CLASS="dddefault">46</TD>
    <TD CLASS="dddefault">0</TD>
</TR>

Это то, что у меня есть прямо сейчас, но это возвращает только класс тега td, а не значение внутри него:

List<?> table = page.getByXPath("//table[@class='datadisplaytable'][1]//tr[2]/td");

Как мне получить значение тега td, а не его свойства?

изменить: приведенный выше код возвращает это:

HtmlTableDataCell[<td class="dddefault">]

person KrispyDonuts    schedule 28.02.2012    source источник
comment
мне нужно получить значение внутри тега td, в этом случае это будет «46»   -  person KrispyDonuts    schedule 28.02.2012
comment
Прошло некоторое время с тех пор, как я в последний раз использовал Java, но должен быть метод с именем text() или что-то подобное   -  person Eduardo    schedule 28.02.2012
comment
Хм, я просмотрел то, что вы сказали, и нашел это ((HtmlTableDataCell) table.get(0)).getTextContent() Кажется, это работает, спасибо за помощь!   -  person KrispyDonuts    schedule 28.02.2012


Ответы (2)


Я пытаюсь создать приложение Java, которое извлекает информацию с веб-страницы. Это часть кода, в котором я пытаюсь получить доступ к значению в 1-м теге td во 2-м теге tr:

Предполагая, что документ такой, как показано в вопросе (TABLE — верхний элемент),

Использование:

/TABLE/TR[2]/TD[1]/text()

Это выбирает любой дочерний текстовый узел первого дочернего элемента TD второго дочернего элемента TR верхнего элемента TABLE.

Если таблица скрыта в XML-документе, но ее можно однозначно идентифицировать по атрибуту CLASS, используйте:

//TABLE[@CLASS='datadisplaytable']/TR[2]/TD[1]/text()

Это выбирает любой дочерний текстовый узел первого дочернего элемента TD второго дочернего элемента TR любого (мы знаем, что есть только один такой) элемент TABLE в XML-документе, так что строковым значением его атрибута CLASS является строка 'datadisplaytable'.

Наконец, если еще хуже, может быть много TABLE элементов, значение атрибута CLASS которых равно 'datadisplaytable', и мы хотим выбрать в первой такой таблице, используйте:

(//TABLE[@CLASS='datadisplaytable'])[1]/TR[2]/TD[1]/text()
person Dimitre Novatchev    schedule 28.02.2012
comment
Это очень помогает в понимании деталей xpath. Я не знал, что можно просто сделать text(). Это может быть лучше, чем кастинг и использование .getTextContent(). Спасибо за помощь! - person KrispyDonuts; 28.02.2012
comment
@Saad: вы можете напрямую получить строковое значение, используя стандартную функцию XPath string(). Таким образом, string(expressionSelectingAnElement) возвращает конкатенацию всех потомков текстового узла элемента. - person Dimitre Novatchev; 28.02.2012

for getting the text content from an element there is an xpath function called "text()" which you can use.

Element containing text 't' exactly         //*[.='t']  
Element <E> containing text 't'             //*[.='t']  
<a> containing text 't'                     //a[contains(text(),'t')]
<a> with target link 'url'                  //a[@href='url']
Link URL labeled with text 't' exactly      //a[.='t']/@href

Если вы также используете JwebUnit, существует метод «getElementTextByXPath», который также можно использовать для получения текста. net.sourceforge.jwebunit .junit.WebTestCase

getElementTextByXPath

public String getElementTextByXPath (String xpath) Устарело. Получить текст данного элемента. Параметры: xpath - xpath элемента.

    for (int i = 1; i != 6; i++) {

        String result = getElementTextByXPath("//td["+i+"][text()]");

        System.out.println("The Content of TD is " +result);
    }
person user1307037    schedule 02.04.2012