XPath中text()仅提取元素的直接文本子节点,不包含后代元素文本;而.(配合string())返回该节点及其所有后代的合并文本字符串。

在XPath中获取节点的文本内容时,text() 和 . 都可以用来提取文本,但它们的作用方式和返回结果有明显区别。
1. text():选择节点的直接文本子节点
text() 是一个节点测试,用于选取元素的**直接文本子节点**。它不会包含后代元素中的文本。
例如,有如下HTML片段:
使用 //div/text() 会返回两个文本节点:
- "Hello "
- "!"
注意:World 中的文本被忽略,因为它是子元素的内容,不是 div 的直接文本子节点。
2. . :选择当前节点本身(常用于string化)
点号 . 代表当前上下文节点。当与字符串函数结合使用(如 string(.) 或在取值时自动转换),它会返回该节点及其所有后代的**合并文本内容**。
继续上面的例子:
使用 string(//div) 或在代码中对 //div 节点调用文本提取方法(如 lxml 或 Scrapy 中的 .extract() 后转字符串),会得到:
"Hello World!"这包括了 div 下所有层级的文本内容,不管是否被嵌套在子标签中。
关键区别总结
- text() 只获取当前元素的直接文本子节点,不包括后代元素中的文本。
- .(配合字符串上下文)获取整个节点树下的全部文本,合并为一个字符串。
- text() 可能返回多个文本片段;而 string(.) 总是返回单个字符串。
基本上就这些。根据你是否需要包含子元素的文本,来决定用哪个方式。要精确控制文本来源就用 text(),要完整内容就用 . 并转成字符串。










