我希望能够使用xpath提取某列下的所有单元格。
有/偶尔会有colspans。
有没有办法做到这一点,我想我要问的是,表标题和它下面的单元格之间是否有任何固有的关系?或者没有内在的关系,尽管在视觉上相当容易,但它在纯xpath的能力之外?
情境: 我们有一个包含十几列和几行的HTML表。列有标题,有些列标题跨越多列。
其中一个列标题(我们不知道哪一个)的文本内容为“选择我”。
我希望能够选择表格中该单元格下的所有单元格。
答案 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]