2012-01-29 77 views
0

我试图用urllib2下载一个网页并保存到MySQL数据库。 这样的:python utf-8 HTML解码错误

result_text = result.read() 
result_text = result_text.decode('utf-8') 

但是我得到这个错误:

数据: 'utf-8' 编解码器不能解码字节均为0x88

现在,HTML meta标签规定,编码确实是utf-8。 香港专业教育学院设法解决这个问题这条线:

result_text = result_text.decode('utf-8','replace') 

它取代了坏人的角色。但是,我不确定这不是说明下载的数据可能有问题,或者我删除了有价值的字符。 IU应该添加页面也包含JavaScript - 尽管这不应该是我相信的问题。

有谁能告诉我为什么会发生这种情况? 感谢

+1

你确定页面上的所有字符都是utf-8吗?尽管标题说明,它可能是“一个谎言” – DonCallisto 2012-01-29 14:02:28

+4

当你得到''utf8'编解码器不能解码字节0x88'错误时,它也应该告诉你有问题的字节的位置。如果该位置是'n',则在调用decode('utf-8')'之前添加一个print语句:'print(repr(result_text [n-20:n + 20]))',并发布结果在这里。 – unutbu 2012-01-29 14:02:36

+1

因为您没有发布链接到源数据,我们无法给您一个正确的答案。 但是,源数据很可能具有错误的UTF-8编码,因此您无法做到这一点。 – 2012-01-29 14:36:34

回答

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')不是一个好主意(基于此TINY示例)。 (2)人物\x01(两次)和\x08让我怀疑你有二进制数据莫名其妙。

(3)您在引用0x88评论中引用的(截断的)错误消息,但示例数据中没有0x88。 (4)请编辑您的问题以显示您在开始时应该做的事情:(a)重现问题所需的最少代码,包括您正在访问的URL(b)完整的错误消息和回溯(c)保证你复制/粘贴(a)和(b)而不是从内存中打字

+0

好吧,让我解决您的意见:1.真实,但唯一无效的序列是在这个“网址:”部分是小的,对我来说微不足道。 2.从代码'result = proxy ['opener']。open(request)result_text = result.read() \t \t \t result_text.decode('utf-8')'url我无法透露。在不同的运行中我得到了不同的无效序列4.放心,我有复制/ psated。 – WeaselFox 2012-01-30 08:04:32