You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XPath选择器中如何正确使用两个@*匹配任意属性含指定值的元素

问题原因

你写的//button[(contains(@*,'close')) and (contains(@*,'modal'))]不生效,是XPath 1.0的节点集取值规则导致的:当contains()的第一个参数传入多节点的属性集合@*时,引擎只会取集合里第一个属性节点的值做字符串匹配,不会遍历所有属性。两个contains(@*, ...)条件都会拿同一个第一个属性去校验,自然不可能同时匹配到分属不同属性的close和modal字符串。
你之前测试能跑通的//button[(contains(@*,'close')) and (contains(@class,'modal'))]只是刚好碰到示例元素的第一个属性就是带close的data-button-id,属于巧合,换个属性顺序的元素就会直接失效,没有通用性。

正确通用写法

用属性子筛选的写法即可,兼容所有支持XPath 1.0的环境(浏览器控制台、Selenium、常见爬虫解析库都支持):

//button[@*[contains(., 'close')] and @*[contains(., 'modal')]]

规则说明

  • @*[contains(., 'close')]:判断当前button下存在任意属性的属性值包含close字符串,满足则返回真
  • @*[contains(., 'modal')]:判断当前button下存在任意属性的属性值包含modal字符串,满足则返回真
  • 两个条件同时成立时才选中元素,不管两个字符串是在同一个属性里,还是分属不同属性,都能正常匹配。

你示例中的button元素,data-button-id属性包含close、class属性包含modal,会被正常命中;如果是<button title="close modal" type="button">这类两个关键词在同一个属性的元素,也能被命中,完全满足通用匹配需求。

内容的提问来源于stack exchange,提问作者Craig Schmidt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:27:47