如何使用XPath查找包含特定关键词的span元素
嘿,我来帮你搞定这个XPath的问题!你遇到的情况其实挺常见的,咱们一步步理清楚:
问题根源
你一开始用//div[@class='commentMessage']/span[text()='endgame']没结果,是因为text()='xxx'是精确匹配——只有当span的文本完全等于'endgame'时才会命中,而你的span文本是'Any endgame spoilers',自然匹配不上。
而用contains(text(), 'endgame')报错,是因为在XPath 1.0里,contains()的第一个参数需要是字符串类型,但text()返回的是一个文本节点集合(哪怕只有一个文本节点,本质还是集合)。部分工具(比如你用的Chrome XPath扩展)对这种类型不匹配的情况会直接抛出错误。
两种可行的解决方案
方案1:使用.表示当前节点的字符串值
这是最通用且简洁的写法,.会自动把当前节点下所有文本内容合并成一个字符串,非常适合你的场景:
//div[@class='commentMessage']/span[contains(., 'endgame')]
这个表达式会匹配所有class为commentMessage的div下,文本内容包含'endgame'关键词的span元素,完美符合你的需求。
方案2:针对文本节点单独判断
如果你一定要明确针对文本节点做匹配,可以把contains()嵌套在text()的判断里,确保传入contains()的是单个文本节点的字符串值:
//div[@class='commentMessage']/span[text()[contains(., 'endgame')]]
这里text()[contains(., 'endgame')]会检查span下的每个文本节点是否包含'endgame',只要有一个满足就会选中该span。
验证效果
拿你给出的示例代码测试:
<div class="commentMessage"> <span>Any endgame spoilers</span> </div>
用上面两种XPath表达式,都能成功选中那个包含'endgame'的span元素。
内容的提问来源于stack exchange,提问作者John

