- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 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
FEED_EXPORTERS = {
'json': 'myproject.exporters.Utf8JsonItemExporter',
}
关于python - 不是 "\u": How to Unescape Unicode in JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37166759/
我是一名优秀的程序员,十分优秀!