我正在编写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路径或建议更好的路径。
谢谢
答案 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(...)
。