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 是无效的)。


评论(0条)

请登录后评论
ziyuan

ziyuan Rank: 16

0

0

0

( 此人很懒并没有留下什么~~ )

首页

栏目

搜索

会员