【问题标题】:Unicode on Scrapy Json outputScrapy Json 输出上的 Unicode
【发布时间】:2015-09-06 01:29:21
【问题描述】:

scrapy 的 json 输出有问题。爬虫效果很好,cli 输出没有问题。 XML 项目导出器正常工作,输出以正确的编码保存,文本没有转义。

  • 尝试使用管道并直接从那里保存项目。
  • 使用来自 json 库的 Feed Exporters 和 jsonencoder

这些不起作用,因为我的数据包含子分支。

json 输出文件中的 Unicode 文本转义如下: "\u00d6\u011fretmen S\u00fcleyman Yurtta\u015f Cad。"

但是对于 xml 输出文件,它是正确写入的: “Öğretmen Süleyman Yurttaş Cad。”

甚至更改了 scrapy 源代码以包含用于 ScrapyJSONEncoder 的 ensure_ascii=False,但没有用。

那么,有没有办法强制 scrapyjsonencoder 在写入文件时不转义。

编辑1: 顺便说一句,使用 Python 2.7.6 作为 scrapy 不支持 Python3.x

这是标准的scrapy爬虫。蜘蛛文件、设置文件和项目文件。首先从基本 url 开始抓取页面列表,然后从这些页面中抓取内容。从页面中提取的数据被分配给在 scrapy 项目的 items.py 中定义的变量,以 utf-8 编码。这没有问题,因为 XML 输出一切正常。

scrapy crawl --nolog --output=output.json -t json spidername

使用此命令可以正常输出 Xml:

scrapy crawl --nolog --output=output.xml -t xml spidername

我已尝试编辑 scrapy/contrib/exporter/init.py 和 scrapy/utils/serialize.py 以将 ensure_ascii=False 参数插入 json.JSONencoder。

编辑2:

又试了调试,到Python2.7/json/encoder.py代码都没问题。数据完好无损且未转义。之后,由于scrapy异步工作并且有很多回调,因此很难调试。

编辑3:

有点脏 hack,但是在编辑 Python2.7.6/lib/json/encoder.py 并将 ensure_ascii 参数更改为 False 后,问题似乎解决了。

【问题讨论】:

  • 这将有助于包含您的一些代码,以及您正在使用的 python 版本
  • 你在插入数据库之前尝试过编码吗??
  • ScrapyJSONEncoder 的参数中设置ensure_ascii=False 应该可以正常工作,发布更多关于你在做什么的信息?
  • @Jithin 数据未保存到数据库中。输出只是一个普通的 json 文档。
  • @Jithin 我没有使用数据库。它是一个纯文本文件,其中包含 json 数据。它与文本文件的编码无关。问题是数据被转义。 vi、nano、Sublime Text 等都以相同的方式显示,因为保存的数据被转义了。

标签: python json unicode utf-8 scrapy


【解决方案1】:

由于我没有要测试的代码,您可以尝试使用codecs 尝试: import codecs f = codecs.open('yourfilename', 'your_mode', 'utf-8') f.write('whatever you want to write') f.close()

【讨论】:

  • 正如我之前写的,这与变量的编码无关。文件输出有问题。我用一种骇人听闻的方法解决了它。有些参数没有传递到主 json 库。
  • @OzcanEsnaf 你是怎么解决的?我在 Scrapy JSON 文件的输出中遇到了类似的问题。
  • 自那个项目以来已经过去了很多时间。正如编辑 3 中所写,Scrapy 使用参数 ensure_ascii 调用 json 编码存在问题。我已将 Python json 库修改为临时修复。它拯救了这一天。
【解决方案2】:

in the documentation 所述,将两个参数添加到您的settings.py:

FEED = 'json'
FEED_EXPORT_ENCODING = 'utf-8'

【讨论】:

    猜你喜欢
    • 2015-03-07
    • 2013-04-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多