XPath 运算符(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
XPath 是一种用于在 XML 或 HTML 文档中定位节点的查询语言,而运算符则是 XPath 的核心工具之一。它通过数学和逻辑运算符的组合,帮助开发者精准筛选、计算或处理网页元素。对于编程初学者和中级开发者而言,掌握 XPath 运算符能够显著提升数据提取和自动化任务的效率。
什么是 XPath 运算符?
XPath 运算符是用于操作节点值或布尔条件的符号,它们可以对节点的文本内容进行数学计算、逻辑判断或条件筛选。例如,通过 //div[@class='price']/text() > 100
,可以筛选出价格超过 100 的商品信息。运算符的使用使 XPath 从简单的路径导航工具,升级为具备逻辑判断能力的数据处理工具。
XPath 运算符的分类
XPath 运算符主要分为四类:算术运算符、比较运算符、逻辑运算符和节点集合运算符。每类运算符都有其特定的使用场景,接下来我们将逐一解析。
算术运算符:数值计算的万能钥匙
算术运算符用于对节点的文本值进行数学运算,例如加减乘除或取模。它们的运算对象通常是通过 XPath 表达式提取的数值型文本。
基础算术运算符
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 加法 | //div[price]/text() + 10 | 原值 + 10 |
- | 减法 | //div[price]/text() - 5 | 原值 - 5 |
* | 乘法 | //div[price]/text() * 2 | 原值 × 2 |
div | 除法(注意拼写) | //div[price]/text() div 3 | 原值 ÷ 3 |
mod | 取模(求余数) | //div[price]/text() mod 5 | 原值 % 5 |
示例场景
假设页面中有以下 HTML 结构:
<div class="product">
<span class="price">200</span>
<span class="discount">30</span>
</div>
使用 XPath 表达式 //div[@class='product']/span[@class='price']/text() - //div/span[@class='discount']/text()
,可以计算出商品折扣后的价格:200 - 30 = 170。
算术运算的注意事项
- 数据类型转换:XPath 会自动将文本值转换为数值类型进行计算,但若文本包含非数字字符(如 "¥200"),需先用
number()
函数提取数值。 - 优先级规则:运算符的优先级遵循数学规则(如
*
比+
先执行),可通过括号()
改变运算顺序。
比较运算符:筛选元素的智能过滤器
比较运算符用于判断节点值是否符合特定条件,返回布尔值(true
或 false
)。它们常用于路径表达式的条件判断,例如 //div[contains(text(), 'Python') and @class='highlight']
。
常用比较运算符
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
= | 等于 | //div[text() = 'Python'] | 匹配文本为 Python 的 div |
!= | 不等于 | //a[not(@href = '#')] | 排除空链接的 a 标签 |
> | 大于 | //price[text() > 100] | 价格超过 100 的元素 |
< | 小于 | //stock[text() < 10] | 库存量不足 10 的元素 |
>= | 大于等于 | //rating[number(.) >= 4] | 评分 ≥4 的元素 |
<= | 小于等于 | //age[text() <= 30] | 年龄 ≤30 的元素 |
实际案例
假设电商页面有以下结构:
<div class="product">
<p>价格:<span>¥199</span></p>
<p>库存:<span>5</span></p>
</div>
要筛选价格低于 200 且库存超过 5 的商品,可使用:
//div[contains(., '¥')]/span[. < 200] and //div/p[2]/span[. > 5]
(注:此处需注意实际路径的准确性)
逻辑运算符:组合条件的逻辑枢纽
逻辑运算符用于将多个条件表达式组合成复杂判断,适用于需要满足多重条件的场景。例如 //div[@class='post' and contains(text(), 'Python') or @id='highlight']
。
逻辑运算符详解
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
and | 逻辑与(两者皆真) | //div[@class='active' and @id='main'] | 同时具备 class 和 id 的元素 |
or | 逻辑或(其一为真) | //a[contains(text(), '首页') or @href='/'] | 文本包含“首页”或链接为根路径的 a 标签 |
not | 逻辑非(取反) | //input[not(@disabled)] | 排除 disabled 属性的输入框 |
进阶技巧
- 嵌套逻辑:通过括号
()
组合多层逻辑判断,例如(//div[@class='A'] and @id='B') or (//span[.='C'])
。 - 优先级:
not()
的优先级高于and
,而and
高于or
。
案例演示
在论坛页面中,需筛选出未被删除且包含特定关键词的帖子:
//div[contains(@class, 'post') and not(contains(@class, 'deleted')) and contains(text(), 'XPath')]
节点集合运算符:合并与过滤元素集合
XPath 提供了两种节点集合运算符 |
和 union()
,用于合并多个节点集合或排除重复元素。
节点集合运算符
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
| | 合并节点集合 | //h1 | //h2 | 合并所有 h1 和 h2 标签 |
union() | 等效于 | | //p[1].union(//p[last()]) | 第一个和最后一个 p 标签 |
使用场景
若需提取页面中的所有标题和按钮元素,可写为:
//h1 | //h2 | //button
XPath 运算符的进阶应用
掌握基础运算符后,可以通过以下技巧进一步提升 XPath 的实用性:
1. 结合函数增强表达能力
XPath 内置了 number()
、string()
、contains()
等函数,可与运算符配合使用。例如:
//div[number(substring-after(text(), '¥')) > 200]
此表达式提取文本中以“¥”开头且数值超过 200 的 div 元素。
2. 多条件嵌套逻辑
通过嵌套运算符构建复杂条件,例如:
//div[@class='product' and (price > 100 or discount > 20)]
表示筛选出“价格高于 100 或折扣超过 20%”的产品。
3. 动态路径计算
运算符可帮助动态生成路径,例如:
//tr[td[1] = 'Python' and position() mod 2 = 0]
此表达式匹配表中“Python”所在行且为偶数行的 tr 元素。
常见问题与解决方案
Q1:运算符优先级导致结果错误?
解决方法:通过括号 ()
明确运算顺序,例如:
//div[number(price) * 0.8 > 100] # 先乘法后比较
//div[number(price) > (100 div 0.8)] # 先除法后比较
Q2:数值计算时出现非数字字符?
解决方法:使用 number()
函数强制转换,例如:
//div[number(substring-after(text(), '¥')) > 200]
Q3:逻辑运算符组合条件时结果不符合预期?
解决方法:分步验证每个条件,例如:
//div[condition1 and (condition2 or condition3)]
结论:XPath 运算符的价值
XPath 运算符是开发者在处理网页数据时不可或缺的工具。通过算术运算符进行数值计算、比较运算符筛选符合条件的元素、逻辑运算符构建复杂条件,以及节点集合运算符合并或过滤元素,开发者能够高效完成数据提取、自动化测试和网页分析任务。掌握这些运算符不仅能提升代码的简洁性,还能显著增强程序的灵活性和准确性。
对于编程初学者,建议从基础运算符开始实践,逐步结合实际项目应用。随着经验的积累,运算符的组合使用将帮助你解决更复杂的场景需求。记住,XPath 的核心在于“路径导航”与“条件筛选”的结合,运算符正是连接这两者的桥梁。