如何使用XPATH定位同时包含指定两个子元素的<a>元素?
定位同时包含指定图标和文本的
<a>元素 目标HTML结构
<ul> <li> <a href="/link1"> <i class="icon-soccer"></i> <label><span>Barcelona</span></label> </a> </li> <li> <a href="/link2"> <i class="icon-baseball"></i> <label><span>Barcelona</span></label> </a> </li> <li> <a href="/link3"> <i class="icon-soccer"></i> <label><span>Milan FC</span></label> </a> </li> </ul>
需求
定位同时包含class为icon-soccer的<i>元素和文本为Barcelona的<span>元素的<a>元素(即第一个<a>标签)。
你之前的代码问题
你尝试的XPath:
//span[text() = "Barcelona"]/preceding::i[@class="icon-soccer"]/parent::a
问题在于preceding::会选取文档中当前节点之前所有位置的<i>元素,不限制它和当前<span>是否属于同一个<a>父节点。比如第二个<span>Barcelona</span>之前,第一个<a>里的<i class="icon-soccer">也会被匹配到,导致拿到错误的<a>元素。
正确的XPath写法
以下两种写法都能准确匹配目标元素:
写法1:从<a>节点直接筛选(推荐)
直接定位<a>,同时验证它的两个子元素条件:
//a[i[@class="icon-soccer"] and label/span[text()="Barcelona"]]
逻辑:选取所有<a>元素,要求它同时拥有class="icon-soccer"的子<i>,以及包含文本为Barcelona的子<span>(嵌套在<label>里)。
写法2:从<span>向上找祖先<a>并验证
先找到目标<span>,再向上找它的<a>祖先,同时验证这个<a>是否有指定的<i>:
//span[text()="Barcelona"]/ancestor::a[i[@class="icon-soccer"]]
额外提示
如果<span>的文本可能包含前后空格(比如<span> Barcelona </span>),可以用normalize-space()处理后再匹配:
//a[i[@class="icon-soccer"] and label/span[normalize-space(text())="Barcelona"]]
内容的提问来源于stack exchange,提问作者technobot
相关产品推荐
相关产品推荐

