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