咨询:XPath表达式(//a[@class="_2whKao"])[3]与//a[@class="_2whKao"][3]的差异
两个XPath表达式的核心区别
1. (//a[@class="_2whKao"])[3]:全局筛选后取第3项
这个表达式的逻辑是先收集所有符合条件的节点,再从全局集合里挑第3个:
- 第一步:
//a[@class="_2whKao"]遍历整个HTML文档,把所有class属性为_2whKao的<a>标签全部找出来,形成完整的节点列表; - 第二步:
[3]对这个全局列表进行索引,直接取列表里的第3个元素(XPath的索引从1开始)。
只要页面里符合条件的<a>总数≥3,这个表达式就能返回结果。
2. //a[@class="_2whKao"][3]:按父节点分组后取每组的第3项
这个表达式的逻辑是按父节点分组,在每组里找第3个符合条件的节点:
- 第一步:
//a[@class="_2whKao"]同样会找出所有符合class条件的<a>; - 第二步:
[3]针对每个<a>的父节点判断——这个<a>是不是它父节点下的第3个class为_2whKao的<a>标签。
如果页面里没有任何一个父节点下存在3个(及以上)符合条件的<a>,这个表达式就会返回0个结果。
直观例子
假设页面结构如下:
<div class="group1"> <a class="_2whKao">链接1</a> <a class="_2whKao">链接2</a> </div> <div class="group2"> <a class="_2whKao">链接3</a> <a class="_2whKao">链接4</a> </div> <div class="group3"> <a class="_2whKao">链接5</a> </div>
- 用
(//a[@class="_2whKao"])[3]:全局列表是[链接1,链接2,链接3,链接4,链接5],取第3个得到链接3; - 用
//a[@class="_2whKao"][3]:每个父节点下最多只有2个符合条件的<a>,没有任何一组有第3个,所以结果是0。
内容的提问来源于stack exchange,提问作者Anamitra Dey
相关产品推荐
相关产品推荐

