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。

算术运算的注意事项

  1. 数据类型转换:XPath 会自动将文本值转换为数值类型进行计算,但若文本包含非数字字符(如 "¥200"),需先用 number() 函数提取数值。
  2. 优先级规则:运算符的优先级遵循数学规则(如 *+ 先执行),可通过括号 () 改变运算顺序。

比较运算符:筛选元素的智能过滤器

比较运算符用于判断节点值是否符合特定条件,返回布尔值(truefalse)。它们常用于路径表达式的条件判断,例如 //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 的核心在于“路径导航”与“条件筛选”的结合,运算符正是连接这两者的桥梁。

最新发布