【问题标题】:python scrapy xpath text() failed extract text with <b />python scrapy xpath text() 使用 <b /> 提取文本失败
【发布时间】:2017-08-03 18:33:56
【问题描述】:

我正在使用 scrapy shell 并尝试获取以下元素的文本部分

<div class="CCCCC">AAA<br />BBB<br />CCC<br />DDD</div>

通过使用

response.xpath('//div [@class="CCCCC"]')[0].extract()

我得到了一个包含标签的整个元素,

<div class="CCCCC">AAA<br>BBB<br>CCC<br>DDD</div>

但使用

response.xpath('//div [@class="CCCCC"]/text()')[0].extract()

我只得到了'AAA',而不是我预期的'AAA&lt;br&gt;BBB&lt;br&gt;CCC&lt;br&gt;DDD'

text() 的行为是否正确?

【问题讨论】:

  • 你为什么会这样? &lt;br&gt; 是一个标签,所以你只有 AAA 是完全合理的。
  • text() 是一个节点测试并选择文本节点的节点。有 4 个文本节点是 &lt;div class="CCCCC"&gt; 的子节点:“AAA”、“BBB”、“CCC”、“DDD”。 'AAA&lt;br&gt;BBB&lt;br&gt;CCC&lt;br&gt;DDD' 是 innerHTML 或其他东西会带给你的东西。但是你不能仅从 XPath 中得到它。

标签: python xpath scrapy


【解决方案1】:

行为是正确的。

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

会将[AAA, BBB, CCC, DDD] 作为列表,但您的代码是

response.xpath('//div [@class="CCCCC"]/text()')[0].extract()

请注意,您使用[0] 询问 first 元素。这就是为什么你只会得到AAA

如果您删除 [0],您将拥有所有四个元素。

【讨论】:

    【解决方案2】:

    请避免在scrapy中使用“[0].extract()”,这可能会导致列表索引出错。

    请使用response.xpath('//div [@class="CCCCC"]/text()').extract_first(),如果没有第一个元素,它会救你

    更多详情请点击此处Scrapy Selector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多