如何通过getByXPath按序获取含指定重叠类名的页面元素
匹配同时包含多个类名的span元素的XPath实现
问题根因
你之前使用的//span[@class='a8Pemb OFFNJ']是对class属性做完整字符串精确匹配,只有当元素的class属性值和引号内的内容完全一致时才会命中,自然无法匹配到带有额外类名的元素。HTML的class是空格分隔的多值属性,不能用全值精确匹配的方式筛选同时持有多个类名的元素。
可用方案
使用下面的XPath语句做单次查询即可,返回结果会自动遵循元素在页面DOM里的原生排列顺序,不需要执行多次查询再合并结果:
通用兼容写法(适配所有XPath 1.0环境,覆盖绝大多数爬虫、UI自动化工具的默认XPath版本)
//span[contains(concat(' ', normalize-space(@class), ' '), ' a8Pemb ') and contains(concat(' ', normalize-space(@class), ' '), ' OFFNJ ')]
逻辑说明:
normalize-space(@class)会先去除class属性值首尾的空白字符,同时把类名之间连续的多个空格、制表符等空白符合并为单个空格,避免因为类名之间的多余空格导致漏匹配- 给处理后的class值前后拼接空格,再匹配带前后空格的目标类名,可以避免误匹配类名的子串(比如不会把名为
a8Pemb_demo的类误判成目标类a8Pemb) - 两个
contains判断同时生效,就能筛选出所有同时持有a8Pemb、OFFNJ两个类名的span元素,无论元素是否带有其他额外类名。
简洁写法(仅适用于支持XPath 2.0及以上版本的运行环境)
如果你的工具环境支持更高版本的XPath,可以用更简洁的语法实现:
//span[every $targetCls in ('a8Pemb', 'OFFNJ') satisfies $targetCls in tokenize(@class, '\s+')]
内容的提问来源于stack exchange,提问作者Cassie Nguyen
相关产品推荐
相关产品推荐

