XPath中获取所有后代文本节点的核心表达式是//text(),它返回文本节点集合而非拼接字符串;实际应用中常配合normalize-space()过滤空白节点,并需宿主语言完成最终字符串拼接。

XPath 中没有直接的“并集”操作符来合并多个文本节点的内容,但可以通过 //text() 选中所有后代文本节点(非空、非空白的需额外过滤),这是最接近“所有后代文本节点集合”的表达方式。
选择所有后代文本节点(基础写法)
//text() 会选取当前上下文节点的所有后代元素中的所有文本节点(包括空白、换行等)。注意:它返回的是文本节点的集合,不是字符串拼接结果。
- 适用于获取 HTML 或 XML 中所有纯文本内容(如爬虫提取页面正文)
- 不包含注释、处理指令、属性值,只选 元素内部的文本节点
- 在浏览器控制台或 lxml 中可直接用,例如:
$x('//div//text()')
过滤掉空白和换行的文本节点
实际使用中,常需排除仅含空白符的节点,可用 normalize-space() 配合布尔判断:
-
//*/text()[normalize-space()]—— 只选内容经去首尾空格、压缩中间空白后非空的文本节点 - 等价于:
//text()[string-length(normalize-space()) > 0] - 这样能避开
中的换行符文本节点
合并所有文本为单个字符串(非 XPath 原生,需宿主语言配合)
XPath 本身不提供字符串拼接函数(XPath 1.0 无 string-join()),所以“并集”若指拼成一个字符串,需外部处理:
- XPath 2.0+ 支持:
string-join(//*/text()[normalize-space()], '') - 但在主流浏览器(仅支持 XPath 1.0)或 requests+lxml 场景中,需用 Python/JS 等代码聚合结果:
Python 示例:[t.strip() for t in tree.xpath('//*/text()') if t.strip()]
再用''.join(...)拼接
基本上就这些。记住核心是 //text(),其余都是围绕它做清洗或后续整合。










