使用 xpath text() 函数从子 elements/node 中提取所有文本

Extract all Text from child elements/node using xpath text() function

我正在使用 scrapy 并希望获取 Child Node 的所有文本。我在 scrapy 命令下获取文本

response.xpath('//div[@class="A"]/text()').get()

我期待结果:“1 -120u”

<div class="A">
<span id="B" class="C">
<span>1&nbsp;</span>-110o</span>
<span id="B">
<span>1&nbsp;</span>
-120u</span>
</div>

我还尝试了以下我在 stackoverlow 上发现的东西

response.xpath('//div[@class="A"]/text()').getall()
response.xpath('//div[@class="A"]/text()').extract()
response.xpath('//div[@class="A"]//text()').get()
response.xpath('//div[@class="A"]//text()').getall()
response.xpath('//div[@class="A"]/text()').extract()

这应该适用于 select div.A 中的所有文本:

response.xpath('//div[@class="A"]//text()').getall()

并过滤掉白色-space 字符串:

response.xpath('//div[@class="A"]//text()[normalize-space()]').getall()

如果您希望输出“1 -120u”,那么您可以:

substrings = response.css('span #B :not(.C)').xpath('.//text()[normalize-space()]').getall()
''.join(substrings)

这使用一个 css selector 到 select span id 为 B 但不是 class C,然后链接一个 xpath selector获取此范围内的所有非白色 space 文本。这将 return 一个子字符串列表,您将它们连接在一起 return 单个字符串,例如“1 -120u”

补充说明:

您尝试 select 的文本不是 div 的直接子元素 - 它在 span 元素的层内。

  • div/text() select 是 div

    的直接子文本
  • div//text() selects 所有文本都是 div

    的后代
  • .get() 用于 select 一个结果 - 如果您的 select 或产生结果列表,此方法将 return 中的第一项该列表

  • .getall() 将 return 当您 select 或选择多个结果时的结果列表,就像您的情况