【问题标题】:Can lxml / scrapy selector not transfer the html entitieslxml / scrapy选择器可以不传输html实体吗
【发布时间】:2020-03-02 08:34:00
【问题描述】:

使用lxml/scrapy选择器xpath后如何获取原始html实体?

我已经尝试过 lxml 而不是 parsel 包,同样的问题。

mytext = '<html><body><span>go&nbsp;od</span></body></html>'
sel = parsel.Selector(text=mytext)
sel.xpath('//body').extract()

实际输出:

['<body><span>go\xa0od</span></body>']

预期输出:

['<body><span>go&nbsp;od</span></body>']

&amp;nbsp; 已转换,如何保持原样?

【问题讨论】:

  • &lt;body&gt;&lt;span&gt;go od&lt;/span&gt;&lt;/body&gt; 这就是你想要的输出的意思吗?

标签: python scrapy lxml html-entities parsel


【解决方案1】:

根据文档,目前,.extract().getall() 方法返回原始 html 带有 unicode 字符,例如\xa0,即&amp;nbsp;。更多信息here.

但是,.extract_first().get() 方法只返回列表中的第一个,并且输出是没有 unicode 字符。 (Docs)

print(sel.xpath('//body').get())

输出:

<body><span>go od</span></body>

但如果你真的想要&amp;nbsp; 字符而不是''\xa0。然后一种解决方案是对这些字符进行常规字符串替换。

例子:

body = sel.xpath('//body').extract()

result = [i.replace('\xa0', '&nbsp;') for i in body]

print(result)

输出:

['<body><span>go&nbsp;od</span></body>']

【讨论】:

  • 嗨 Rithin,感谢您的回答。由于&amp;nbsp;不是我们要保留的唯一html实体,所以我认为可以直接输出原始html实体而无需进一步替换的方法会更好。
  • @XiaojinLiu,有什么不使用&lt;body&gt;&lt;span&gt;go od&lt;/span&gt;&lt;/body&gt;的具体原因吗?需要原始实体的上下文是什么?
  • 因为我们要保存原始的html文件以备将来重新抓取
  • @XiaojinLiu,你可以先保存再传给选择器吗?
  • 嗨 Rithin,我们没有保存整个 html 文件的计划,我们只对其中的一部分感兴趣。所以这就是为什么我们需要选择器帮助我们抓住它。
猜你喜欢
  • 2016-05-30
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多