怎么用XPath选取文本节点 text()的用法

14次阅读

text() 选取元素的直接文本子节点而非所有后代或元素本身;例如 //div/text() 匹配 “Hello” 和 “!”,但不匹配嵌套在 中的 “World”。

怎么用XPath选取文本节点 text()的用法

XPath 中的 text() 是用来选取元素的直接文本子节点,不是所有后代文本,也不是元素本身,而是紧贴在该元素标签内的纯文字内容。

text() 只匹配直接子文本节点

比如 html 片段:

HelloWorld!


其中 //div/text() 会匹配到两个文本节点:“Hello”“!”,但不会匹配 里的 “World”,因为它不是

的直接子文本节点,而是嵌套在 内的。

常见用法和注意事项

  • 要获取某个元素的全部可见文本(含后代),用 String(//div)//div//text()(后者返回所有后代文本节点,需合并)
  • text() 返回的是节点集,不是字符串;在支持 XPath 1.0 的环境(如浏览器控制台、Selenium)中,不能直接用 text() 做等于判断,得用 normalize-space() 处理空白
  • 匹配精确文本时建议写成://div[normalize-space(text()) = "Hello"],避免前后空格或换行干扰
  • 如果一个元素内有多个 text() 节点(比如被注释或标签隔开),text()[1] 可取第一个,text()[last()] 取最后一个

实际例子:抓取标题但避开图标文字

假设有:

用户中心 v2.1


想只取“用户中心”这个文本,可以:
//h2/text()[normalize-space() != ""] → 得到中间那个非空文本节点
或者更稳一点://h2/text()[contains(., "用户中心")]

不推荐的写法

//div/text() = "Hello" 在多数 XPath 引擎中会报错或行为异常,因为 = 左侧是节点集,右侧是字符串,类型不匹配。
应改用://div[text() = "Hello"](前提是整个元素只有这一个 text 子节点),或更稳妥的://div[normalize-space() = "Hello"]

基本上就这些。text() 看似简单,但容易忽略它只管“直接子”、不处理空白、不自动合并这些细节。

text=ZqhQzanResources