python3爬虫报错UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-47: ordinal not

python3爬虫报错UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 45-47: ordinal not…

今天用python在pycharm中搞爬虫的时候,在公司电脑上运行还好好的,拿回家以后妈蛋就死活用不了啦。

一直报错:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-47: ordinal not in range(128)

报错的代码段是:

url_response = request.urlopen(url_request,timeout=10)   # 请求数据

如图所示:
python3爬虫报错UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-47: ordinal not_第1张图片

找遍百度,大多毫无卵用。

查了不是这个问题:
python3爬虫报错UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-47: ordinal not_第2张图片

也是不是pycharm的问题:
python3爬虫报错UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-47: ordinal not_第3张图片

原因和解决方案:

Python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x?? in position 1: ordinal not in range(128),python没办法处理非ascii编码的,此时需要自己设置将python的默认编码,一般设置为utf8的编码格式。

但是在我使用的python3.6.5 默认就是utf8编码格式,而且我上面查了都是utf8,gbk之类的。所以也不存在这种问题。

后面发现python3 urlopen()链接地址中不能出现中文,而上述代码的 word 是传入的中文字符,终于找到了问题的所在。

我的URL是采用拼接的方式:

ord = input('关键词:')
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&ct=201326592&v=flip

输入的是中文。所以报错。

解决办法:

使用urllib.parse.quote进行转换。

import re
from urllib import request
# 解决ascii编码报错问题,不报错则可以注释掉
from urllib.parse import quote
import string

word = input('关键词:')
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&ct=201326592&v=flip
url_request = quote(url, safe=string.printable)  # 解决ascii编码报错问题,不报错则可以注释掉
url_response = request.urlopen(url_request,timeout=10)   # 请求数据
html = url_response.read().decode('utf-8')  # 加编码,重要!转换为字符串编码,read()得到的是byte格式的。

程序头部需要添加:

from urllib.parse import quote

同时需要import string 导入string模块

方法quote的参数safe表示可以忽略的字符。

string.printable表示ASCII码第33~126号可打印字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余的是一些标点符号、运算符号等。如果去掉safe参数的内容将会出错。

实用效果:
python3爬虫报错UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-47: ordinal not_第4张图片


python2的编码问题更多,python3默认utf8还好一些。

你可能感兴趣的:(python爬虫系列)