Python HTML 的 UTF-8 解码错误
我正在尝试使用urllib2来下载一个网页,并把它保存到MySQL数据库里。像这样:
result_text = result.read()
result_text = result_text.decode('utf-8')
但是我遇到了这个错误:
数据:'utf8' 编码无法解码字节 0x88
现在,HTML的meta标签显示编码确实是utf-8。我用这一行代码解决了这个问题:
result_text = result_text.decode('utf-8','replace')
这行代码替换了那些坏字符。不过,我不太确定这是不是说明下载的数据有问题,或者我是不是删除了有用的字符。我还应该补充一下,这个页面也包含JavaScript——不过我认为这不应该是个问题。
有没有人能告诉我为什么会发生这种情况?谢谢。
1 个回答
0
对你这小数据样本的分析:
>>> s = "\x98cW\x01\xa2\xbb\xba\xcc\xec\x90\xfc\xffP\xcb%\x01\x08"
>>> u = s.decode('utf8', 'replace')
>>> u
u'\ufffdcW\x01\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd%\x01\x08'
>>> u.count(u'\ufffd')
9
>>> len(u)
16
(1) 这绝对不是UTF-8编码,里面有超过50%的unicode字符是无效的。换句话说,继续使用 data.decode('utf8', 'replace')
绝对不是个好主意(根据这个小样本来看)。
(2) 字符 \x01
(出现了两次)和 \x08
让我怀疑你可能有一些二进制数据。
(3) 你在评论中引用的(截断的)错误信息提到了 0x88
,但在样本数据中并没有 0x88
。
(4) 请修改你的问题,展示一下你一开始应该做的事情:(a)最少的代码来重现这个问题,包括你访问的URL;(b)完整的错误信息和追踪记录;(c)确保你是复制粘贴了(a)和(b),而不是凭记忆输入的。