0

0

XPath的contains()函数匹配规则是什么?

星降

星降

发布时间:2025-07-18 19:45:02

|

858人浏览过

|

来源于php中文网

原创

xpath的contains()函数用于判断一个字符串是否包含另一个子字符串,返回布尔值。其基本结构为contains(string1, string2),其中string1为被搜索的大字符串,string2为要查找的小字符串。1. contains()只关心“有没有”,不关心“在哪里”或“有多少”。2. 在匹配文本内容时,使用contains(., '关键词')可匹配元素及其后代的所有文本内容,而text()仅匹配当前元素直接的文本节点。3. 在属性匹配中,contains(@属性名, '关键词')可用于模糊匹配属性值,但需注意部分匹配问题,可通过concat(' ', @class, ' ')解决类名匹配问题。4. contains()适用于动态内容和模糊匹配场景,如匹配动态生成的id或部分固定的文本内容。5. contains()区分大小写,xpath 2.0及以上版本可用lower-case()实现不区分大小写的匹配。

XPath的contains()函数匹配规则是什么?

XPath的contains()函数,简单来说,就是用来判断一个字符串是否包含另一个子字符串。它是个布尔函数,如果包含,就返回true;如果不包含,就返回false。这在处理动态内容或者需要模糊匹配的场景下,简直是利器。

这玩意儿的用法其实挺直观的,它的基本结构是contains(string1, string2)。这里面的string1是你想要搜索的那个大字符串,而string2则是你想要在大字符串里找的那个小片段。说白了,就是问“string1里面有没有string2?”

举个例子,如果你想找页面上所有文本内容里包含“产品详情”这几个字的div元素,你就可以写成//div[contains(text(), '产品详情')]。或者,如果你想找所有class属性里有“active”这个词的按钮,那就是//button[contains(@class, 'active')]。我个人觉得,理解它最关键的一点,就是它只关心“有没有”,不关心“在哪里”或者“有多少”。它只会告诉你一个明确的是或否。

contains()函数与text()节点:深入理解文本内容匹配

当咱们用contains()去匹配元素的文本内容时,最常见也最容易让人迷惑的就是它跟text()节点的关系。很多时候,大家会直接写//div[contains(text(), '某个关键词')]。这确实能匹配到直接包含该关键词的文本节点。但这里头有个小坑,text()函数只会返回当前元素直接的文本子节点。如果一个div里面还有其他标签,比如,那么text()可能就无法获取到里面的文本了。

所以,如果一个元素包含了多段文本或者嵌套了子元素,而你想匹配的是这个元素“可见”的全部文本内容,那么直接用contains(., '关键词')可能更符合预期。这里的.)代表当前节点,当它被用作字符串时,XPath会自动取其所有后代文本内容的拼接。比如,一个

你好世界
text()可能会返回“你好”和“!”两个独立的文本节点,而string(.)或者直接用.作为contains()的第一个参数,则会把整个“你好世界!”都考虑进去。我通常会倾向于后者,因为这样更少遗漏,也更符合我们直观上对“文本内容”的理解。当然,这也不是绝对的,具体情况还得看你到底想匹配什么。

contains()函数在属性匹配中的应用及注意事项

再说说属性,这又是另一个contains()大显身手的地方。特别是那些class属性,经常是多个类名用空格隔开,比如class="btn btn-primary active"。你想找所有带有“active”类的元素,用//button[contains(@class, 'active')]就非常方便。它会检查@class属性的值里有没有“active”这个子串。

Groq
Groq

GroqChat是一个全新的AI聊天机器人平台,支持多种大模型语言,可以免费在线使用。

下载

不过,这里有个小小的陷阱。如果你的class里有个词是“inactive”,而你只想匹配“active”,那么contains(@class, 'active')也会把“inactive”匹配进去。因为“inactive”里也包含了“active”这个子串。这种情况下,如果需要精确匹配一个独立的类名,比如确保它是个完整的单词,可能就需要更复杂的XPath表达式,比如//button[contains(concat(' ', @class, ' '), ' active ')]。通过在类名前后都加上空格再进行匹配,可以有效地避免这种部分匹配的问题。这虽然有点绕,但能解决很多实际问题。

XPath contains()函数在处理动态内容和模糊匹配时的策略

那什么时候我们特别需要contains()呢?我的经验是,当页面上的元素属性值或者文本内容不是完全固定的,但其中一部分是稳定的,这时候contains()就派上用场了。比如,很多网站的id属性是动态生成的,像product_item_12345product_item_67890。这时候,你不可能去匹配完整的id,但你可以用//div[contains(@id, 'product_item_')]来匹配所有产品项。

再比如,按钮上的文本可能是“查看详情”、“点击查看更多详情”等等,虽然文字不完全一样,但“详情”这个词总是出现。那//a[contains(text(), '详情')]就能把它们一网打尽。

需要注意的是,contains()区分大小写的。如果你想进行不区分大小写的匹配,而你用的XPath版本(比如XPath 1.0)又不支持lower-case()这样的函数,那就得想点别的办法了。一种笨办法是写多个or条件,比如contains(text(), '详情') or contains(text(), '详情')(当然这只是示意,实际是匹配不同大小写的组合)。在XPath 2.0或更高版本中,就可以用contains(lower-case(text()), '关键词')来优雅地解决这个问题。

总的来说,contains()函数是XPath工具箱里一个非常实用且灵活的工具,尤其是在处理那些部分可变、部分固定的页面元素时,它能大大提高你编写XPath表达式的效率和鲁棒性。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

249

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

609

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

547

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

539

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

158

2025.07.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.2万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号