前提是要确定内容确实声明是gbk编码,一般出现这个错误是不能解码如0xff0xae之类的。

根据我排查的原因,似乎是抓取的网页虽然是gbk编码,但内容中有用户上传的文字,而这些文字本身的编码不是gbk,所以即使在网页中,本身也显示的是乱码。

解决的方法很粗暴,直接给decode()函数添加参数。

一般调用decode()函数都是decode('gbk'),此时隐含的另一个参数是'strict',即出现解码错误即抛出UnicodeError错误;这里使用参数'ignore',即出现解码错误直接忽略,不抛出任何异常。实际上还可以设置为'replace',即对解码出错的地方进行替换。


import urllib.request

r = urllib.request.urlopen('http://www.njust.edu.cn')
con = r.read()
dec = con.decode('gbk', 'ignore')
print(dec)