'gbk' codec can't encode character '\xa0' in position 12248: illegal multibyte sequence

在网上爬取一些字节流出现了这个问题,明明是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') # 改变标准输出的默认编码

你可能感兴趣的:(python,错误集)