如何使用XPath选择class属性包含"a"的所有div元素?
正确的XPath表达式选择包含指定class的div元素
你之前的写法问题在于XPath对属性匹配的逻辑和你预期的不一样:
//div[@class="a"]是精确匹配class属性值完全等于"a"的元素,但你的div元素class都是多值组合(比如a b、a c),所以匹配不到;//div[@class="a *"]是在找class属性值正好是"a *"的元素,这显然不是你要的结果。
下面是几种可靠的解决方案:
方法1:精确匹配完整类名(推荐,兼容所有XPath版本)
用concat把class属性前后加上空格,再用contains匹配包含' a '的情况,这样可以避免误匹配类似aa或ab这种包含"a"但不是独立类名的情况:
//div[contains(concat(' ', @class, ' '), ' a ')]
方法2:XPath 2.0+ 专用写法
如果你的XPath环境支持2.0及以上版本,可以用tokenize把class按空格分割成列表,再检查是否存在等于"a"的项:
//div[tokenize(@class, '\s+')='a']
方法3:简单匹配(不推荐,存在误匹配风险)
如果能确定"a"总是class属性的第一个值,或者不介意误匹配类似a-b这种包含"a"的类名,可以用starts-with:
//div[starts-with(@class, 'a')]
但这种写法会匹配到class为aa或者a-test的元素,所以除非你明确知道场景,否则不建议用。
内容的提问来源于stack exchange,提问作者MagicHat
相关产品推荐
相关产品推荐

