xpath - 根据某些文本获取行数

时间:2014-02-07 06:09:41

标签: xpath xpath-2.0

我正在编写xpaths以从左侧边栏中选择每个类别下的所有链接: http://www.indexmundi.com/commodities/'> http://www.indexmundi.com/commodities/

我想逐个选择每个类别下的链接。我编写了以下xpath,它正在以某种方式选择第一类(商品价格指数)下的链接。但我想知道如何选择其他类别下的链接。我想添加一个检查 h3 ,如果它的文字是能量,请计算并选择之前的所有行,然后如果 h3 文本是饮料,计算并选择能量和饮料之间的所有行

.//* [@ ID = 'dlCommodities'] / tbody的/ TR [位置()<计数(以下同胞:: TR / TD / H3)-1] / TD / A

这是另一个xpath: .//*[@ ID = 'dlCommodities'] / tbody的/ TR [前同辈:: TR / TD / H3 [。 ='能量']和跟随兄弟:: tr / td / h3 [。 ='饮料']] / td / a

它满足了第二个要求,即在特定标题之间选择行,但它缺少一个节点。

请帮我修复这些x路径或建议更好的路径。

谢谢

1 个答案:

答案 0 :(得分:1)

我将您的实际问题理解为:查找属于给定类别的所有链接。为此,请找到类别,然后在下一个类别之前检索所有元素。

如果您愿意,可以删除换行符,为了便于阅读,我添加了换行符。

//tr[td/h3="Energy"]/(self::tr, following-sibling::tr[
  . << //tr[td/h3="Energy"]/following-sibling::tr[td/h3][1]
])

如果您没有兼容XPath 2.0的处理器,则无法使用<<运算符来测试节点顺序(当前节点必须位于下一个类别之前)。 XPath 1.0解决方案甚至略短,但我认为可读性更差:

//tr[td/h3="Energy"] | //tr[td/h3="Energy"]/following-sibling::tr[
  ./preceding-sibling::tr[td/h3][1][td/h3="Energy"] and not(td/h3)
]

两个查询都将选择一个类别的所有节点;计算它们将它们包装成count(...)