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

星降
发布: 2025-07-18 19:45:02
原创
719人浏览过

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里面还有其他标签,比如<span>,那么text()可能就无法获取到<span>里面的文本了。

所以,如果一个元素包含了多段文本或者嵌套了子元素,而你想匹配的是这个元素“可见”的全部文本内容,那么直接用contains(., '关键词')可能更符合预期。这里的.)代表当前节点,当它被用作字符串时,XPath会自动取其所有后代文本内容的拼接。比如,一个<div>你好<span>世界</span>!</div>text()可能会返回“你好”和“!”两个独立的文本节点,而string(.)或者直接用.作为contains()的第一个参数,则会把整个“你好世界!”都考虑进去。我通常会倾向于后者,因为这样更少遗漏,也更符合我们直观上对“文本内容”的理解。当然,这也不是绝对的,具体情况还得看你到底想匹配什么。

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

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

阿里云-虚拟数字人
阿里云-虚拟数字人

阿里云-虚拟数字人是什么? ...

阿里云-虚拟数字人 2
查看详情 阿里云-虚拟数字人

不过,这里有个小小的陷阱。如果你的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表达式的效率和鲁棒性。

以上就是XPath的contains()函数匹配规则是什么?的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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