XPath全称为XML路径语言,最初是为了在XML文档中定位节点而设计的,后来也被广泛应用于HTML文档的元素查找,是Web自动化测试、网页数据爬取场景中非常常用的技术。它通过将文档转换为节点树的结构,使用路径表达式来匹配对应的节点,从而实现精准的信息定位。

XPath的核心概念
节点类型
XPath将XML或HTML文档看作是由多种节点组成的树形结构,常见的节点类型包括:
- 根节点:文档的最顶层节点,对应整个文档
- 元素节点:文档中的标签,比如<div>、<p>都属于元素节点
- 属性节点:元素的属性,比如<input type="text">中的type就是属性节点
- 文本节点:元素内部的文本内容
路径表达式基础
路径表达式是XPath的核心,用来描述从当前节点到目标节点的查找路径,最基础的路径表达式有以下几种:
| 表达式 | 含义 |
|---|---|
| / | 从根节点开始选取,或者在当前路径下选取直接子节点 |
| // | 从当前文档的任意位置选取匹配的节点,不考虑节点位置 |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
| @ | 选取属性节点 |
常用XPath语法示例
下面通过实际的代码示例来展示不同场景下的XPath用法,所有示例基于如下的HTML结构:
<!DOCTYPE html>
<html>
<body>
<div class="container">
<ul id="list">
<li class="item">第一个列表项</li>
<li class="item active">第二个列表项</li>
<li class="item">第三个列表项</li>
</ul>
<input type="text" name="username" value="测试用户" />
</div>
</body>
</html>基础节点定位
如果要选取所有的<li>节点,可以使用如下XPath表达式:
//li
如果要选取id为list的<ul>节点下的所有直接子<li>节点,可以使用:
//ul[@id="list"]/li
属性过滤定位
如果要选取class属性包含active的<li>节点,可以使用contains函数:
//li[contains(@class, "active")]
如果要选取name属性为username的<input>节点,可以使用:
//input[@name="username"]
文本匹配定位
如果要选取文本内容为第二个列表项的<li>节点,可以使用text函数:
//li[text()="第二个列表项"]
位置索引定位
XPath的索引从1开始,如果要选取第一个<li>节点,可以使用:
//li[1]
如果要选取最后一个<li>节点,可以使用last函数:
//li[last()]
XPath使用注意事项
在使用XPath时需要注意几个常见问题:首先,HTML文档的标签可能存在不规范的写法,部分浏览器的XPath解析器会自动修正,但建议尽量保证文档结构规范。其次,使用contains函数匹配class属性时,要注意避免部分匹配导致的误选,比如class为"item-active"的节点也会被contains(@class, "item")匹配到。最后,过于复杂的XPath表达式可能会影响定位效率,在可以简化的情况下尽量使用更简洁的路径表达式。