Python:在解析JSON字符串时处理损坏的Unicode字节

16

我的代码从UserVoice网站上获取一些内容。你可能知道,UserVoice是一款无法正确处理数据的糟糕软件;为了减少搜索页面上的文本量,他们将文本截断在大约300个字符处,然后在末尾添加“...”。问题是,他们不在多字节字符的中间切割,导致出现部分utf-8“字节”:例如,对于字符è,我得到的是\xc3而不是\xc3\xa8s

当然,当我将这个可怕的混合物交给json.loads时,它会失败并出现UnicodeDecodeError。因此,我的问题很简单:我该如何要求json.loads忽略这些错误的字节,就像我如果有访问函数内部就可以使用.decode('utf-8', 'ignore')一样呢?

谢谢。

2个回答

13

您不需要要求simplejson忽略它们。 当我遇到类似问题时,我只需运行.decode('utf-8','ignore').encode('utf-8'并继续执行。


好的,我正在撰写一个答案,说我可以在将字符串传递给json.loads之前对其进行解码。 谢谢,显然有效! - zopieux

10

只需将Unicode字符串传递给json.loads()

>>> badstr = "qualité"[:-1]+".."
>>> badstr
'qualit\xc3..'
>>> json_str = '["%s"]' % badstr
>>> import json
>>> json.loads(json_str)
Traceback (most recent call last):
 ...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 6: invalid \
continuation byte
>>> json.loads(json_str.decode('utf-8','ignore'))
[u'qualit..']

@Lucho的答案包含了额外的.encode,这是必要的吗? - mcont
1
@Matteo:不需要在.decode()之后使用.encode(),因为json格式是为Unicode文本定义的。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接