在网上爬取一些字节流出现了这个问题,明明是utf-8 的解码却出现了 ‘gbk’的错误
def getUrlListOne(url):
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,'
' like Gecko) Chrome/50.0.2661.94 Safari/537.36'}
target_req = request.Request(url=url, headers=header)
target_response = request.urlopen(target_req, timeout=3)
target_html = target_response.read().decode('utf-8', 'ignore')
datas = BeautifulSoup(target_html, 'lxml')
print(datas)
现在打印出现了这个错误。。。。经过在度娘的帮助下发现:
1.字符就是unicode字符,字符串就是unicode字符数组
如果用以下代码测试,
print('a'=='\u0061')
会发现结果为True,足以说明两者的等价关系。
2.str转bytes叫encode,bytes转str叫decode,如上面的代码就是将抓到的字节流给decode成unicode数组
我根据上面的错误信息分析了字节流中出现\xbb的地方,发现有个\xc2\xbb的特殊字符»,我怀疑是它无法被解码。
用以下代码测试后
print(b'\xc2\xbb'.decode('utf-8'))
它果然报错了:UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xbb’ in position 0: illegal multibyte sequence
原来是print()函数自身有限制,不能完全打印所有的unicode字符。
知道原因后,google了一下解决方法,其实print()函数的局限就是Python默认编码的局限,因为系统是win7的,python的默认编码不是’utf-8’,改一下python的默认编码成’utf-8’就行了
在方法下面加上就解决了:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030') # 改变标准输出的默认编码