如何使用XPath通配符选择带有指定类的元素?
嗨,我来帮你搞定这个问题~你之前写的//img[@class='poly *']没生效,是因为XPath里用=做属性匹配是精确匹配,这里的*会被当成普通字符串的一部分,不是你想要的通配符哦。要实现匹配class里包含poly的img元素,得用XPath的内置函数,下面给你几种实用的方案:
匹配包含
poly字符串的class(简单场景)
如果你的class属性里poly是其中一部分,不管它在什么位置,直接用contains()函数就行://img[contains(@class, 'poly')]不过要注意,这个写法会误匹配像
polyx1或者xpoly这类包含poly字符但不是独立类名的情况,如果你的class是空格分隔的多类名,建议用更严谨的方法。匹配以
poly开头的class(贴合你的示例场景)
看你的示例元素class都是poly x1、poly x2这种,也就是poly后面跟空格和其他类名,用starts-with()函数会更精准://img[starts-with(@class, 'poly ')]这里特意加了个空格,就是为了避免匹配到
polyx1这种没有空格分隔的情况,确保只匹配poly作为第一个类名的元素。匹配作为独立类名的
poly(最严谨的多类场景)
如果以后遇到poly可能在class属性中间或者末尾的情况(比如<img class="x1 poly x2">),想要确保poly是一个独立的类名,可以用这种写法://img[contains(concat(' ', @class, ' '), ' poly ')]原理是把class属性的前后都加上空格,然后匹配
poly(前后都带空格),这样就能精准定位到作为独立类名的poly,不会误匹配其他包含poly的字符串。XPath 2.0+ 用正则匹配(灵活度拉满)
如果你的运行环境支持XPath 2.0及以上版本,还可以用正则表达式来匹配,用matches()函数://img[matches(@class, '\bpoly\b')]这里的
\b是单词边界,能确保poly是一个独立的单词(也就是独立的类名),非常灵活。
内容的提问来源于stack exchange,提问作者Joe

