如何让XPath的text()查询实现不区分大小写匹配?
大小写不敏感的XPath文本匹配解决方案
你的问题里,text()确实可能是导致方案失效的关键原因之一,另外原查询本身没有处理大小写问题,下面分情况给你解决办法:
为什么text()会出问题?
text()返回的是当前元素的直接子文本节点列表,如果目标文本被其他子元素拆分(比如<p>Hi <span>Deez</span> Foo</p>),contains(text(), 'Deez')会匹配失败——因为text()返回的是["Hi ", " Foo"]两个文本节点,没有包含'Deez'的项。这种情况下应该用string(.)获取元素的完整文本内容(包括所有后代元素的文本)。
具体解决方案
1. XPath 2.0+ 环境(现代浏览器DevTools、新版Selenium等)
直接用lower-case()或upper-case()统一大小写,配合string(.)获取完整文本:
//*[contains(lower-case(string(.)), 'deez')]
或者:
//*[contains(upper-case(string(.)), 'DEEZ')]
2. XPath 1.0 环境(旧工具、部分爬虫库)
XPath 1.0没有内置大小写转换函数,用translate()手动实现:
//*[contains(translate(string(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'deez')]
translate()会把第一个参数里的所有大写字母替换成对应的小写,再用contains匹配。
如果只想匹配元素的直接子文本节点
如果你确实不需要包含后代元素的文本,只检查当前元素的直接子文本节点,可以调整为:
//*[text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'deez')]]
这里text()作为节点集,只要其中任意一个文本节点满足大小写不敏感的匹配条件,就会选中对应的父元素。
内容的提问来源于stack exchange,提问作者Toms Code
相关产品推荐
相关产品推荐

