Найти ячейки под столбцом в таблице HTML с xpath? - PullRequest
0 голосов
/ 05 ноября 2011

Я хочу иметь возможность извлекать все ячейки в определенном столбце с помощью xpath.

Есть / может быть иногда colspans.

Есть ли способ сделать это, с помощью которого, я полагаю, я спрашиваю, есть ли какая-то внутренняя связь между заголовком таблицы и ячейками под ней? Или нет присущих им отношений, и, несмотря на то, что визуально это сделать довольно просто, они не в состоянии чистого xpath?

Сценарий: У нас есть HTML-таблица с дюжиной столбцов и несколькими строками. У столбцов есть заголовки, а некоторые из заголовков столбцов охватывают более одного столбца.

Один из этих заголовков столбцов (мы не знаем, какой именно) имеет текстовое содержание «Pick Me».

Я хочу иметь возможность выбрать все ячейки в этой ячейки в таблице.

Ответы [ 3 ]

3 голосов
/ 11 августа 2012

Вы можете сделать это в XPath 1. Я предполагаю, что только один столбец имеет желаемый заголовок и атрибут rowspan не встречается.

tbody/tr/td[
      count(preceding-sibling::td[not(@colspan)])
      + sum(preceding-sibling::td/@colspan)
    = count(../../tr[1]/th[.='Pick Me']/preceding-sibling::th[not(@colspan)])
      + sum(../../tr[1]/th[.='Pick Me']/preceding-sibling::th/@colspan)]

Вышеприведенное выражение возвращает все ячейки , начиная с в крайнем левом столбце заголовка Pick Me.Дублируя большую часть логики, вы можете получить ячейки, начинающиеся с любого столбца, охватываемого Pick Me, или ячеек , разделяющих столбец с Pick Me, возможно, самой широкой интерпретацией вашего вопроса.:

tbody/tr/td[
      count(preceding-sibling::td[not(@colspan)])
      + sum(preceding-sibling::td/@colspan)
    < count(../../tr[1]/th[.='Pick Me']/preceding-sibling::th[not(@colspan)])
      + sum(../../tr[1]/th[.='Pick Me']/preceding-sibling::th/@colspan)
      + count(../../tr[1]/th[.='Pick Me'][not(@colspan)])
      + sum(../../tr[1]/th[.='Pick Me']/@colspan)
  and count(preceding-sibling::td[not(@colspan)])
      + sum(preceding-sibling::td/@colspan)
      + not(@colspan)
      + sum(@colspan)
    > count(../../tr[1]/th[.='Pick Me']/preceding-sibling::th[not(@colspan)])
      + sum(../../tr[1]/th[.='Pick Me']/preceding-sibling::th/@colspan)]

Стратегия здесь состоит в том, чтобы вычислить «позицию» как левой, так и правой стороны каждой ячейки и заголовок Pick Me, где «позиция» означает количество столбцов слева от чего-либо.Ячейка перекрывает столбец (столбцы) заголовка, если и только если слева от ячейки слева от заголовка, а справа от ячейки справа от левого заголовка.В этом смысл числовых сравнений.

1 голос
/ 07 ноября 2011

Нет, в xpath нет связи между заголовками столбцов в таблице и столбцами, в которые они попадают.

Единственный способ найти ячейки, которые находятся под определенным заголовком столбца, - это с помощью некоторого другого кода подсчитать столбцы (учесть colspans) до тех пор, пока не будет найден нужный заголовок таблицы, а затем подсчитать столько столбцов в каждой строке, чтобы извлечь клетки.

0 голосов
/ 07 февраля 2018

В случае, если вам нужно получить определенный столбец, например первый:

//tr/td[1]
...