【问题标题】:Find cells under a column in an HTML table with xpath?使用 xpath 在 HTML 表格中的列下查找单元格?
【发布时间】:2011-11-04 20:49:10
【问题描述】:

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

有/可能偶尔会有跨度。

有什么方法可以做到这一点,我想我想问的是,表格标题与其下面的单元格之间是否存在任何内在关系?还是没有内在的关系,尽管在视觉上相当容易做到,但它超出了纯 xpath 的能力?

场景: 我们有一个包含十几列和几行的 HTML 表。列具有标题,并且某些列标题跨越多个列。

其中一个列标题(我们不知道是哪一个)具有文本内容“Pick Me”。

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

【问题讨论】:

  • 请至少提供一个 .xml/.html 样本。
  • 老实说,我不确定这会给这个问题带来什么好处,而且每次我提供一个响应请求时(而不是因为它实际上为问题增加了价值),它是导致问题像以前一样被忽略,或者人们在忽略实际问题的情况下粗略地根据示例争吵完全不正确的答案。我很确定每个能够回答这个问题的人都知道表格是什么样子的——“样本”会提供什么附加值?我已经听过很多次了,所以我真的很感兴趣。
  • 你期待什么样的答案?我不知道 Ruby,我不知道单元格和列。我所知道的是 xml、html、xsl、xpath。我怎么可能帮你?
  • 好了,谢谢,我想通过最后的评论,我实际上对问题所在有所了解。我已经改写了这个问题,希望以一种更清楚的方式。虽然我猜只是将其称为“HTML 表格”会完成同样的事情吗?
  • 你还必须写下你想要提取的内容。现在我不明白你想提取什么。你说要提取一列下的所有单元格?这个专栏到底是哪一个?

标签: html xpath html-table


【解决方案1】:

您可以在 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 标题的 leftmost 列中生成所有单元格starting。通过复制大量逻辑,您可以获得从 Pick Me 跨越的 any 列开始的单元格或与 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 标题的“位置”,其中“位置”表示某项左侧的列数。当且仅当单元格的左侧位于标题右侧的左侧且单元格的右侧位于标题左侧的右侧时,单元格才会与标题的列重叠。这就是数值比较的意义。

【讨论】:

    【解决方案2】:

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

    查找位于特定列标题下方的单元格的唯一方法是,使用其他代码计算列(考虑 colspans),直到找到所需的表标题,然后计算每行中的列数以提取细胞。

    【讨论】:

    • 我喜欢你用我的评论来回答,你把它作为你的评论发布,然后接受答案。你真的很棒。
    • 我等着看你是否要把它作为答案发布,因为我说它是正确的。你没有,所以我做到了。如果其他人出现并想要参考这个问题/答案,他们不应该通过挖掘 cmets 来找到答案。我应该编辑你的答案吗?老实说,我不确定在这种情况下正确的协议是什么。毕竟,即使你在 cmets 中回答了,你的答案仍然是 /wrong/。
    • @FailedDev,SO 不在这里,所以你可以获得很高的声誉,它是来回答问题的。将实际好的答案标记为“不回答”(我假设是你)是没有意义的。
    • 我在维基上找到了答案,这样就不会产生任何代表。我相信这会让每个人都满意。
    • @svick 你不知道这篇文章的历史,你也看不到我删除的答案。以及对原始问题的无数编辑。我取消了我的答案 - 这当然现在看起来错误,但如果你在我回答的时候看到了这个问题,你会发现它实际上是正确的。另请参阅我的回答下的 OP 评论。一点都不粗鲁好吗?我完全不在乎代表。
    【解决方案3】:

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

    //tr/td[1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2017-09-03
      • 2013-04-26
      • 2020-10-23
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多