使用xpath在HTML表格中的列下查找单元格?

时间:2011-11-04 20:49:11

标签: html xpath html-table

我希望能够使用xpath提取某列下的所有单元格。

有/偶尔会有colspans。

有没有办法做到这一点,我想我要问的是,表标题和它下面的单元格之间是否有任何固有的关系?或者没有内在的关系,尽管在视觉上相当容易,但它在纯xpath的能力之外?

情境: 我们有一个包含十几列和几行的HTML表。列有标题,有些列标题跨越多列。

其中一个列标题(我们不知道哪一个)的文本内容为“选择我”。

我希望能够选择表格中该单元格下的所有单元格

3 个答案:

答案 0 :(得分:3)

您可以在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标题的“位置”,其中“position”表示左侧的列数。如果,并且仅当单元格的左侧是标题的左侧,而单元格的右侧位于标题的左侧,则单元格与标题的列重叠。这就是数字比较的意思。

答案 1 :(得分:1)

不,表中的列标题与它们所在的列之间的xpath中没有关联。

查找位于特定列标题下方的单元格的唯一方法是,使用其他一些代码来计算列(帐户的colspans),直到找到所需的表头,然后将每行中的多列计为提取细胞。

答案 2 :(得分:0)

如果您需要获取特定列,例如第一个:

//tr/td[1]