不是“\u”:如何在JSON中取消Unicode的转义?

2024-09-28 23:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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"},

这是我使用的代码:

^{pr2}$

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


Tags: namejson网站price形式scrapyu7528u2605
2条回答

the ^{} module用于text -> text decoding(在Python 2中这不是严格必需的,但是在Python 3中str没有decode方法,因为这些方法是针对str->;bytes和返回,而不是str->;str->;str)。使用unicode_escape编解码器进行解码将返回正确的数据:

import codecs

somestr = codecs.decode(strwithescapes, 'unicode-escape')

因此,要修复你得到的名字,你应该:

^{pr2}$

如果问题出在您正在生成的JSON中,您只需要确保json模块没有强制字符串使用字符编码;它在默认情况下是这样做的,因为并不是所有的JSON解析器都能处理真正的Unicode字符(它们通常假设数据是以带转义符的ASCII字节发送的)。因此,无论在何处调用json.dump/json.dumps(或创建json.JSONEncoder),请确保显式传递ensure_ascii=False。在

编辑(2016-10-19):

在Scrapy 1.2+中,可以使用^{}设置为输出JSON文件所需的字符编码,例如FEED_EXPORT_ENCODING = 'utf-8'(默认值为None,这意味着\uXXXX转义)


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

请注意,在scray上有一个开放的问题,使输出编码成为一个参数: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()生成一个有效的Pythondict。在

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

^{pr2}$

现在是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',
}

相关问题 更多 >