XPath中查找不包含某属性的元素应使用not(@attr),且必须置于方括号内作为谓词,如//div[not(@id)];不可省略方括号,亦不可混淆为属性值为空或不等于某值。

XPath 中查找不包含某个属性的元素,用 not(@attr) 是完全正确的写法,但要注意它必须放在谓词 [] 内,并且要明确作用在哪个元素上。
基本语法:not(@属性名)
这个表达式本身不是完整路径,它是一个布尔条件,必须嵌套在方括号中,作为元素的筛选谓词使用。例如:
-
//div[not(@id)]—— 选中所有没有id属性的<div> 元素 <li> <code>//*[@class and not(@id)]—— 选中有class属性但没有id属性的所有元素 -
//input[not(@disabled) and not(@readonly)]—— 选中既没disabled也没readonly的<input> - 写成
//div not(@id)❌ —— 缺少方括号,XPath 解析失败 - 写成
//div[@id = '']❌ —— 这匹配的是id=""(空值),不是“不存在” - 写成
//div[not(@id = 'xxx')]❌ —— 这是“id 不等于 xxx”,不是“没有 id 属性” //button[@type and not(@name)]- 如果还要排除
disabled状态://button[@type and not(@name) and not(@disabled)]
常见误区提醒
容易出错的地方不是语法本身,而是上下文理解偏差:
配合其他条件一起用
实际场景中常需组合判断。比如找「是按钮、有 type 属性、但没有 name 属性」的元素:
基本上就这些 —— 记住 not(@xxx) 必须进 [],它判断的是“属性是否存在”,不是“属性值是否为空”。