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

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

问题描述:

我希望能够通过xpath提取某个列下的所有单元格。使用xpath在HTML表格的列中查找单元格?

有/可能偶尔会发现colspans。

有没有什么办法可以做到这一点,我想我在问,表头和它下面的单元格之间是否存在任何固有关系?或者是没有内在关系,尽管在视觉上很容易做到,它纯粹xpath的能力之外?

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

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

我想能够选择下表格中的单元格中的所有单元格

+1

请提供至少,一个.xml/html的样品。 – FailedDev

+0

我真的不知道会给这个问题带来什么好处,每次我提供了一个回应请求(而不是因为它实际上增加了问题的价值),它导致无论是在忽略问题就像以前一样多,或者人们基于这个例子粗暴地回答了完全不正确的答案,而忽略了实际的问题。我很确定每个能够回答这个问题的人都知道表格是什么样子 - “样本”提供了什么样的附加价值?我听过很多次,所以我对这里很感兴趣。 – GlyphGryph

+0

你期望什么样的答案?我不知道Ruby,我不知道单元格和列。我知道的是xml,html,xsl,xpath。我怎么可能帮你? – FailedDev

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

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

+0

我喜欢你回答我的评论,并将它发布为你的评论,然后接受答案。你真的很棒。 – FailedDev

+4

我等着看你是否打算把它作为答案,因为我说这是正确的。你没有,所以我做到了。如果有其他人出现并想要参考这个问题/答案,他们不应该通过评论挖掘找到答案。我应该编辑你的答案吗?我真的不确定这种情况会有什么合适的协议。毕竟,即使你在评论中回答,你的答案仍然是/错的/。 – GlyphGryph

+0

@FailedDev,SO不在这里,您可以获得很高的声誉,它在这里回答问题。将实际的好答案标记为“不是和回答”(我认为是你)是毫无意义的。 – svick

您可以在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)] 

上面表达式产生的所有小区中的接我头的最左边的列开始。通过大量重复的逻辑,你可以得到的细胞开始在任何列跨区送我或细胞与接我,也许你的问题的最广义解释共享列:

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标题,其中“位置”表示左侧的列数。如果且仅当单元格的左侧位于标题右侧的左侧并且单元格的右侧位于标题左侧的右侧,单元格将与标题的列重叠。这是数字比较的含义。

如果您需要抓住特定列例如第一:

//tr/td[1]