最常用且准确的方式是使用 not() 或 not(node()):not() 匹配不含子元素但可含文本/注释的元素,not(node()) 匹配完全无任何子节点(含空白)的元素。

要选择没有子节点的元素,XPath 中最常用且准确的方式是使用 not(*) 或 not(node()),具体取决于你对“没有子节点”的定义。
只不含元素子节点(允许文本、注释、处理指令)
用 not(*) —— 表示该元素下没有子元素(即没有其他标签),但可以有文本、空格或注释。
-
示例://div[not(*)] → 匹配所有不包含任何子元素的
<div> <li>常见场景:匹配纯文本容器、空 div、带文字但无嵌套标签的元素</li> <h3>完全不含任何子节点(包括文本、注释等)</h3> <p>用 <strong>not(node())</strong> —— 表示该元素下连文本、换行、空格、注释都没有,是真正“空”的元素。</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/ai/2525" title="Misum AI"><img src="https://img.php.cn/upload/ai_manual/001/246/273/176907419957850.png" alt="Misum AI" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a href="/ai/2525" title="Misum AI">Misum AI</a> <p>一站式聚合多模型AI问答工具</p> </div> <a href="/ai/2525" title="Misum AI" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <ul> <li> <font color="#2a5800">示例://span[not(node())]</font> → 匹配完全空白的 <code><span></span>或<span> </span>(注意:含空白字符也算 node(),所以严格来说,not(node())要求内部完全无内容,连空白也不行) - 更稳妥写法(忽略空白文本):
//span[not(*) and normalize-space() = ''],兼顾常见 HTML 中的换行缩进
补充说明:为什么不用 * = '' 或 string-length() = 0?
这些写法容易误判:
-
*/text() = ''语法错误,不能直接比较 -
string-length(.) = 0会把所有子元素的文本拼起来再算长度,如果子元素里有文本,即使父元素没直接文本也会被漏掉 -
normalize-space() = ''单独用不保险,因为它不区分是否含子元素;必须和not(*)组合才准确
基本上就这些。核心记两点:要排除子标签就用 not(*),要连空白都不要就用 not(node()) 或组合 not(*) and normalize-space() = ''。









