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

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










