如何使用XPath获取节点的文本内容,text()和.有什么不同?

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

在XPath中获取节点的文本内容时,text(). 都可以用来提取文本,但它们的作用方式和返回结果有明显区别。

1. text():选择节点的直接文本子节点

text() 是一个节点测试,用于选取元素的**直接文本子节点**。它不会包含后代元素中的文本。

例如,有如下HTML片段:

Hello World!

使用 //div/text() 会返回两个文本节点:

  • "Hello "
  • "!"

注意:World 中的文本被忽略,因为它是子元素的内容,不是 div 的直接文本子节点。

2. . :选择当前节点本身(常用于string化)

点号 . 代表当前上下文节点。当与字符串函数结合使用(如 string(.) 或在取值时自动转换),它会返回该节点及其所有后代的**合并文本内容**。

继续上面的例子:

使用 string(//div) 或在代码中对 //div 节点调用文本提取方法(如 lxml 或 Scrapy 中的 .extract() 后转字符串),会得到:

"Hello World!"

这包括了 div 下所有层级的文本内容,不管是否被嵌套在子标签中。

关键区别总结

  • text() 只获取当前元素的直接文本子节点,不包括后代元素中的文本。
  • .(配合字符串上下文)获取整个节点树下的全部文本,合并为一个字符串。
  • text() 可能返回多个文本片段;而 string(.) 总是返回单个字符串。

基本上就这些。根据你是否需要包含子元素的文本,来决定用哪个方式。要精确控制文本来源就用 text(),要完整内容就用 . 并转成字符串。