<p><strong>编辑</strong>(2016-10-19):</p>
<p>在Scrapy 1.2+中,可以使用<a href="https://docs.scrapy.org/en/latest/topics/feed-exports.html#std:setting-FEED_EXPORT_ENCODING" rel="nofollow">^{<cd1>}</a>设置为输出JSON文件所需的字符编码,例如<code>FEED_EXPORT_ENCODING = 'utf-8'</code>(默认值为<code>None</code>,这意味着<code>\uXXXX</code>转义)</p>
<hr/>
<p>注意:我正在修改我在问题评论中链接的<a href="https://github.com/scrapy/scrapy/issues/1963#issuecomment-215784229" rel="nofollow">what I wrote on GitHub for a similar issue</a>。在</p>
<p>请注意,在scray上有一个开放的问题,使输出编码成为一个参数:<a href="https://github.com/scrapy/scrapy/issues/1965" rel="nofollow">https://github.com/scrapy/scrapy/issues/1965</a></p>
<hr/>
<p><a href="https://github.com/scrapy/scrapy/blob/ebef6d7c6dd8922210db8a4a44f48fe27ee0cd16/scrapy/utils/serialize.py#L11" rel="nofollow">Scrapy's default JSON exporter</a>使用(默认)<code>ensure_ascii=True</code>参数,因此在写入文件之前,它将Unicode字符作为<code>\uXXXX</code>序列输出。(这是执行<code>-o somefile.json</code>时使用的方法)</p>
<p>在导出器中设置<code>ensure_ascii=False</code>将输出Unicode字符串<a href="https://github.com/scrapy/scrapy/blob/cf716ea200b4e7056a570434b8ab46a61aa20240/scrapy/exporters.py#L114" rel="nofollow">which will end up as UTF-8 encoded on file</a>。请参阅底部的自定义导出程序代码。在</p>
<p>为了说明这一点,让我们将输入的JSON字符串读回一些要处理的数据:</p>
<pre><code>>>> import json
>>> test = r'''{"price": "13,000", "name": "\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc"}'''
>>> json.loads(test)
{u'price': u'13,000', u'name': u'\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc'}
</code></pre>
<p>带有<code>\uXXXX</code>序列的输入是Python的有效JSON(应该如此),并且<code>loads()</code>生成一个有效的Python<code>dict</code>。在</p>
<p>现在让我们再次序列化为JSON:</p>
^{pr2}$
<p>现在是<code>ensure_ascii=False</code></p>
<pre><code>>>> # now dumping with ensure_ascii=False, you get a Unicode string
>>> json.dumps(json.loads(test), ensure_ascii=False)
u'{"price": "13,000", "name": "\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc"}'
>>>
</code></pre>
<p>让我们打印出来看看区别:</p>
<pre><code>>>> print json.dumps(json.loads(test))
{"price": "13,000", "name": "\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc"}
>>> print json.dumps(json.loads(test), ensure_ascii=False)
{"price": "13,000", "name": "壁殴り代行様専用★ テレビ本体 20v型 白 送料込"}
</code></pre>
<p>如果要将JSON项编写为UTF-8,可以这样做:</p>
<p>1。。定义自定义项导出器,例如在项目中的<code>exporters.py</code>文件中</p>
<pre><code>$ cat myproject/exporters.py
from scrapy.exporters import JsonItemExporter
class Utf8JsonItemExporter(JsonItemExporter):
def __init__(self, file, **kwargs):
super(Utf8JsonItemExporter, self).__init__(
file, ensure_ascii=False, **kwargs)
</code></pre>
<p>2。。替换<code>settings.py</code>中的默认JSON项导出器</p>
<pre><code>FEED_EXPORTERS = {
'json': 'myproject.exporters.Utf8JsonItemExporter',
}
</code></pre>