python - 不是 "\u": How to Unescape Unicode in JSON?

标签 python json unicode encoding scrapy

我正在尝试使用 Scrapy 从非英语网站上进行抓取。抓取的 JSON 格式的结果看起来像这样:

{"price": "13,000", "name": "\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc"},

这是我正在使用的代码:

def parse(self, response):
    for sel in response.xpath('//section[@class="items-box"]'):
      item = ShopItem()
      item['name'] = sel.xpath('a/div/h3/text()').extract()
      item['price'] = sel.xpath('a/div/div/div[1]/text()').extract().replace("$", "")
      yield item

如何将未转义的 Unicode 字符输出到 JSON?

最佳答案

编辑(2016-10-19):

使用 Scrapy 1.2+,你可以使用 FEED_EXPORT_ENCODING设置输出 JSON 文件所需的字符编码,例如 FEED_EXPORT_ENCODING = 'utf-8'(默认值为 None,即 \uXXXX 转义)


注意:我正在改编 what I wrote on GitHub for a similar issue我在问题的评论中链接到。

请注意,Scrapy 上有一个 Unresolved 问题,使输出编码成为一个参数:https://github.com/scrapy/scrapy/issues/1965


Scrapy's default JSON exporter使用(默认)ensure_ascii=True 参数,因此它在写入文件之前将 Unicode 字符输出为 \uXXXX 序列。 (这是在执行 -o somefile.json 时使用的)

在导出器中设置 ensure_ascii=False 将输出 Unicode 字符串,which will end up as UTF-8 encoded on file .在此处查看底部的自定义导出器代码。

为了说明,让我们将输入的 JSON 字符串读回一些数据以进行处理:

>>> 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'}

带有 \uXXXX 序列的输入是 Python 的有效 JSON(它应该如此),并且 loads() 产生一个有效的 Python dict .

现在让我们再次序列化为 JSON:

>>> # dumping the dict back to JSON, with default ensure_ascii=True
>>> 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"}'
>>> 

现在 ensure_ascii=False

>>> # 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"}'
>>>

让我们打印出来看看区别:

>>> 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型 白 送料込"}

如果你想将 JSON 项目写成 UTF-8,你可以这样做:

1.. 定义自定义项目导出器,例如在项目的 exporters.py 文件中

$ 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)

2.. 替换 settings.py

中的默认 JSON 项目导出器
FEED_EXPORTERS = {
    'json': 'myproject.exporters.Utf8JsonItemExporter',
}

关于python - 不是 "\u": How to Unescape Unicode in JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37166759/

相关文章:

java - 在android中解析JSON字符串

java - JSON ORDER_MAP_ENTRIES_BY_KEYS 工作不一致

iOS 表情符号在 UILabel 中搞砸了

c# - 比较两个 utf-8 编码字符串的 byte[] 是否与比较两个 unicode 字符串相同?

python - 有没有办法在 python 中的 KeyboardInterrupt 上永不退出?

python - 在 Pandas 中 reshape 数据框

python - 为什么python字典会改变顺序?

java - jackson JsonMappingException : Unrecognized column 'C' : known columns {"A" ,"B"}

css - 在按钮中居中 unicode 文本

python - NumPy:同时 max() 和 min() 的函数