推荐用 contains(concat(‘ ‘, @class, ‘ ‘), ‘ btn ‘) 精确匹配独立 class 名,通过首尾加空格避免子串误匹配(如 “button” 包含 “btn”),兼顾空 class 处理可加 normalize-space()。

用 contains(@class, 'value') 确实能匹配 class 属性中包含指定字符串的节点,但要注意:它只是子串匹配,不是精确的 class 名匹配。
为什么直接 contains(@class, ‘btn’) 可能出错
比如 html 是
,
contains(@class, 'btn') 会命中,但你也可能只想选纯 class="tuc-19bc10f7-532e4d-0 btn tuc-19bc10f7-532e4d-0" 的元素;更糟的是, 也会被误匹配——因为 "button" 包含子串 "btn"。 推荐写法:按空格分隔后精确匹配单个 class
标准做法是把 @class 拆成单词,再判断是否等于目标值。XPath 1.0(主流浏览器支持的版本)没有 split 函数,所以常用技巧是加前后空格再匹配:
-
contains(concat(' ', @class, ' '), ' btn ')—— 最常用、兼容性好 - 原理:把
class="tuc-19bc10f7-532e4d-0 btn-primary btn tuc-19bc10f7-532e4d-0"变成" btn-primary btn ",再查有没有" btn "(带空格),就能避免子串误匹配 - 注意:开头结尾加空格,确保单独的 class(如第一个或最后一个)也能被正确识别
其他常见情况处理
- class 值为空或只有空格?加
normalize-space()更稳妥:contains(concat(' ', normalize-space(@class), ' '), ' active ') - 要匹配多个 class 同时存在?组合使用:
contains(concat(' ', @class, ' '), ' btn ') and contains(concat(' ', @class, ' '), ' primary ') - XPath 2.0+ 可用
tokenize(),但浏览器不支持,慎用
基本上就这些。日常写 XPath 选 class,优先用 contains(concat(' ', @class, ' '), ' xxx '),安全又通用。