为何使用XPath指定索引时仍匹配两个元素,且无法选中第二个?
XPath索引匹配异常的原因解析
核心问题:局部索引 vs 全局索引的混淆
你遇到的问题本质是没搞清楚XPath两种索引的规则:
局部索引(直接加
[n]):
当你写//table[@class='你的表格类名'][1]时,这里的[1]不是指全局匹配到的第1个表格,而是每个父节点下的第1个符合类名条件的表格。
举个实际场景:如果页面第一个表格的父容器里还放了一个其他类名的表格,那第一个目标表格就是父容器下的第2个表格,自然不满足[1]的条件;而第二个目标表格的父容器里只有它一个,所以是父容器下的第1个,会被[1]匹配。
当你用[2]时,页面里没有任何父容器存在第2个符合类名的表格,所以找不到元素。全局索引(加括号包裹):
要是想选全局匹配结果里的第n个表格,必须用括号把整个匹配表达式包起来,再加索引:(//table[@class='你的表格类名'])[1] <!-- 全局第1个目标表格 --> (//table[@class='你的表格类名'])[2] <!-- 全局第2个目标表格 -->括号的作用是先把所有匹配到的表格凑成一个全局节点集合,再按顺序取第n个(XPath的索引是从1开始的)。
子元素定位的正确写法
如果要获取第二个表格下的子元素(比如行、单元格),别写成//table[@class='你的表格类名']//tr[2](这会匹配每个表格里的第2行),正确写法是:
(//table[@class='你的表格类名'])[2]//tr
内容的提问来源于stack exchange,提问作者Andrey G
相关产品推荐
相关产品推荐

