本文由 资源共享网 – ziyuan 发布,转载请注明出处,如有问题请联系我们![免费]常用XPath
收藏XPath(XML Path Language)是一种用于在 XML 或 HTML 文档中定位节点的语言。以下是 XPath 的完整语法、运算符、轴(Axes)、函数及常用表达式的系统总结。
1. 基础路径表达式
XPath 使用路径表达式来选取节点,类似于文件系统中的路径。
表格
表达式 描述 示例
nodename 选取此节点的所有子节点 bookstore 选取 bookstore 元素的所有子节点
/ 从根节点选取(绝对路径起始符) /bookstore 选取根元素 bookstore
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(递归下降) //book 选取所有 book 元素,不管位置
. 选取当前节点 ./title 选取当前节点下的 title
.. 选取当前节点的父节点 ../author 选取父节点下的 author
@ 选取属性 //@lang 选取名为 lang 的所有属性
2. 谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点,嵌在方括号 [] 中。
表格
表达式 描述 示例
[n] 选取第 n 个子元素(索引从 1 开始) /bookstore/book 选取第一个 book
[last()] 选取最后一个子元素 /bookstore/book[last()]
[last()-1] 选取倒数第二个子元素 /bookstore/book[last()-1]
[position()<3] 选取前两个子元素 /bookstore/book[position()<3]
[@attr] 选取拥有指定属性的元素 //title[@lang] 选取拥有 lang 属性的 title
[@attr='val'] 选取属性值等于指定值的元素 //title[@lang='eng']
[expr] 基于子元素值进行筛选 /bookstore/book[price>35]
3. 通配符
用于选取未知的 XML 元素或属性。
表格
通配符 描述 示例
* 匹配任何元素节点 /bookstore/* 选取 bookstore 的所有子元素
@* 匹配任何属性节点 //title[@*] 选取所有带有属性的 title 元素
node() 匹配任何类型的节点 //title/node() 选取 title 下的所有类型子节点
4. 选取若干路径
使用 | 运算符可以选取若干个路径。
//book/title | //book/price:选取所有 book 元素的 title 和 price 子元素。
//title | //price:选取文档中所有的 title 和 price 元素。
5. 轴(Axes)
轴定义了相对于当前节点的节点集关系。语法格式为 axis::node-test[predicate]。
表格
轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)
ancestor-or-self 选取当前节点的所有先辈以及当前节点本身
attribute 选取当前节点的所有属性
child 选取当前节点的所有子元素(默认轴,可省略)
descendant 选取当前节点的所有后代(子、孙等)
descendant-or-self 选取当前节点的所有后代以及当前节点本身
following 选取文档中当前节点的结束标签之后的所有节点
following-sibling 选取当前节点之后的所有同级节点
parent 选取当前节点的父节点
preceding 选取文档中当前节点的开始标签之前的所有节点
preceding-sibling 选取当前节点之前的所有同级节点
self 选取当前节点
示例:
//ul/ancestor::div:选取 ul 元素的所有祖先 div 元素。
//h1/following-sibling::p:选取 h1 元素之后紧邻的同级 p 元素。
6. 运算符
XPath 支持算术、比较、逻辑和集合运算符。
算术运算符
表格
运算符 描述 示例
+ 加法 6 + 4
- 减法 6 - 4
* 乘法 6 * 4
div 除法 8 div 4
mod 取余数 5 mod 2 (结果为 1)
比较运算符
表格
运算符 描述 示例
= 等于 price=9.80
!= 不等于 price!=9.80
< 小于 price<9.80
<= 小于或等于 price<=9.80
> 大于 price>9.80
>= 大于或等于 price>=9.80
注意:在 XPath 2.0+ 中还支持 eq, ne, lt, le, gt, ge 等值比较运算符。
逻辑运算符
表格
运算符 描述 示例
or 或 price=9.80 or price=9.70
and 与 price>9.00 and price<10.00
not() 非 not(price=9.80)
集合运算符
表格
运算符 描述 示例
| 并集 //book | //cd
7. 常用函数
XPath 内置了超过 100 个函数,以下是 Web 自动化和数据提取中最常用的几类。
字符串函数
contains(string1, string2):如果 string1 包含 string2,返回 true。
示例://div[contains(@class, 'header')]
starts-with(string1, string2):如果 string1 以 string2 开头,返回 true。
示例://a[starts-with(@href, 'https')]
text():获取当前节点的文本内容。
示例://span[text()='登录'] (精确匹配)
normalize-space(string):去除首尾空白并将中间连续空白替换为单个空格。
示例://div[normalize-space(text())='Hello World']
string-length(string):返回字符串长度。
concat(string1, string2, ...):连接字符串。
substring(string, start, length):截取字符串。
数值函数
number(object):将对象转换为数字。
sum(node-set):计算节点集的数值总和。
floor(number):向下取整。
ceiling(number):向上取整。
round(number):四舍五入。
节点集函数
last():返回当前节点集中的最后一个节点的位置。
position():返回当前节点在节点集中的位置索引。
示例://li[position()=1] 或简写为 //li
count(node-set):返回节点集中的节点数量。
name(node-set):返回节点名称。
local-name(node-set):返回不带命名空间前缀的节点名称。
8. 最佳实践与技巧
优先使用相对路径:避免使用以 /html/body/div... 开头的绝对路径,因为页面结构的微小变化会导致路径失效。推荐使用 //tag[@attr='value'] 形式的相对路径。
属性定位优先:
id 属性通常是唯一的,最稳定://input[@id='username']
其次是 name、data-* 等属性。
class 属性可能包含多个值且动态变化,建议配合 contains() 使用://div[contains(@class, 'btn-primary')]
处理动态文本:
如果文本内容固定,使用 text()='Exact Text'。
如果文本包含多余空格或只需部分匹配,使用 contains(text(), 'Keyword')。
组合条件:
使用 and 提高定位精度://input[@type='text' and @name='q']
使用 or 兼容多种情况://button[@id='submit' or @class='submit-btn']
轴定位解决复杂结构:
当目标元素没有独特属性,但其相邻元素有时,使用轴。
例如:定位“张三”所在行的“年龄”列://td[text()='张三']/following-sibling::td
9. 常见错误与注意事项
索引从 1 开始:XPath 的节点索引是从 1 开始的,而不是编程中常见的 0。
大小写敏感:XPath 对标签名和属性值是大小写敏感的。
命名空间:如果 XML 文档使用了命名空间,直接使用标签名可能无法匹配,需要注册命名空间前缀或使用 local-name() 函数忽略命名空间。
属性不能包含子节点:不能对属性使用路径运算符(如 @href/src 是无效的)。

