UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 26269: illegal multibyte sequence

来源:赵克立博客 分类: Python 标签:Python发布时间:2016-05-31 21:38:29最后更新:2016-06-01 08:49:41浏览:3518
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2016-06-01 08:49:41
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

用python3.4 的urllib抓取百度的页面的时候出现以下错误

QQ截图20160531213711.png

下面是代码

import urllib.request,chardet
r=urllib.request.urlopen('https://www.baidu.com')#此处只是说明  
re=r.read()
charset=chardet.detect(re)
chars=charset['encoding']
print(chars)
strr=re.decode(chars)
print(strr)

错误很奇怪输出时用的是utf-8的编码报错确是gbk


从上面报错可以看出页面已经解析出来是utf-8的 解码的时候也是用utf-8进行解码的,查看百度源码也是utf-8的这样来说应该是没有问题才对但是还是出现啦上面的报错

从报错上可以看出代码是运行到最后一个print(strr)后才出的错


经过查资料找到解决方法:原来是print()函数自身有限制,不能完全打印所有的unicode字符。

其实print()函数的局限就是Python默认编码的局限,因为系统是win7的,python的默认编码不是'utf-8',改一下python的默认编码成'utf-8'就行了

import urllib.request,chardet,io,sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码
r=urllib.request.urlopen('https://www.baidu.com/')#此处只是说明
re=r.read()
charset=chardet.detect(re)
chars=charset['encoding']
print(chars)
strr=re.decode(chars)
print(strr)

ok可以正常输出啦,

设置编码后不会发现在ide中可以正常显示,但是到啦控制台中文就显示成乱码啦,如果要在控制台下输出请设置成下面编码

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')         #改变标准输出的默认编码



最后,附上一些常用的和中文有关的编码的名称,分别赋值给encoding,就可以看到不同的效果了:


编码名称用途
utf8所有语言
gbk简体中文
gb2312简体中文
gb18030简体中文
big5繁体中文
big5hkscs繁体中文



请注意上面贴出来的代码只是说明取百度的页面,要取回正常的页面要添加header头部信息,才能取到正常的页面


微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python