Объединение класса и Nth-Child в Perl TreeBuilder и XPath

Я пытаюсь получить сумму столбца в таблице html. Первая строка этой таблицы — все заголовки. Каждая ячейка каждой строки после первой имеет класс «правильно», поэтому я собирался использовать этот класс в качестве селектора, чтобы игнорировать ненужные заголовки. Однако мне нужна только вторая ячейка каждой строки. Как мне объединить эти два селектора? Это правильно?

my $tree = HTML::TreeBuilder::XPath->new_from_file($fileName);
foreach $value ($tree->findnodes('//table/tr/td[@class="right"[position()=2]')){
    stuff;
}

person user2933738    schedule 10.03.2014    source источник
comment
Есть две левые квадратные скобки, но только одна правая квадратная скобка. Наверное, это неправильно.   -  person choroba    schedule 10.03.2014


Ответы (1)


Вы можете комбинировать предикаты, просто ставя один за другим:

//table/tr/td[@class="right"][2]

или вы можете использовать логический and

//table/tr/td[@class="right" and position()=2]
person choroba    schedule 10.03.2014
comment
Итак, это было бы правильно для добавления значения каждой из этих ячеек? foreach $val ($tree-›findnodes('//table/tr/td[@class=right][2])){ $sum += $val-›findvalue(); } - person user2933738; 10.03.2014
comment
Если вы просто хотите суммировать, вы можете использовать функцию XPath sum(): sum(//table/tr/td[@class="right"][2]) - person choroba; 10.03.2014
comment
Подождите, даст ли использование этой нотации все ячейки ‹td›, которые являются вторыми дочерними элементами, или это даст мне вторых потомков ячеек ‹td›? - person user2933738; 10.03.2014
comment
@ user2933738: [position()=2] и [2] означают одно и то же в XPath. parent/element[2] возвращает второго element потомка parent. Чтобы получить второго потомка element, вам понадобится parent/element/*[2]. - person choroba; 10.03.2014
comment
Хорошо. Итак, чтобы получить правильный класс, второй ребенок ‹tr›, я бы сказал так? findnodes('//table/tr[2][@class=right]') Или это даст мне второй дочерний элемент объектов правильного класса tr? - person user2933738; 10.03.2014
comment
@ user2933738: Нет, проверьте документацию и мой ответ. - person choroba; 11.03.2014