如何获取第一个子元素的XPath?使用//div[@class='input-group']/input[1]返回全部input标签
这是XPath里一个很常见的优先级陷阱问题,我来帮你理清楚~
首先得明确你遇到的核心问题:XPath中括号的作用域优先级。你写的//div[@class='input-group']/input[1],实际逻辑是遍历页面中所有class为input-group的div,然后分别取出每个div下的第一个input元素。如果页面里有多个这样的div,自然会返回多个input节点,这就是你觉得“返回所有input标签”的原因。
根据你的实际需求,有两种解决方案:
需求1:获取整个文档中第一个符合条件的input
如果你只想要页面里第一个class为input-group的div下的第一个input,那需要用括号把整个节点集表达式包裹起来,再取第一个元素:
(//div[@class='input-group']/input)[1]
括号在这里的作用是先把所有符合//div[@class='input-group']/input的节点收集成一个完整的节点列表,然后再从这个列表中选取第一个元素,而不是给每个div单独取第一个子input。
需求2:给每个div[@class='input-group']取第一个子input(但之前写法没生效?)
如果你的需求确实是为每个目标div取第一个input,但之前的写法返回了所有input,那大概率是你之前的表达式写错了(比如没加[1])。不过还有一种特殊情况:如果div下的第一个子节点不是input(比如有文本节点、<span>、<label>等前置节点),但你需要的是div下的第一个子元素(不管标签),那应该用:
//div[@class='input-group']/*[1]
如果还是要限定input标签,那//div[@class='input-group']/input[1]是正确的写法,它只会选取每个div下的第一个input子节点,不会返回该div下的其他input。
额外提示:XPath优先级的坑
记住这个关键区别:
//A/B[1]:对每个A节点,选取它的第一个B子节点(多节点结果)(//A/B)[1]:先选取所有A下的B节点,再取这个集合的第一个元素(单节点结果)
这是XPath新手最容易踩的坑之一,搞清楚括号的作用就没问题啦~
内容的提问来源于stack exchange,提问作者SaP

