今天用python在pycharm中搞爬虫的时候,在公司电脑上运行还好好的,拿回家以后妈蛋就死活用不了啦。
报错的代码段是:
url_response = request.urlopen(url_request,timeout=10) # 请求数据如图所示:
找遍百度,大多毫无卵用。
查了不是这个问题:
也是不是pycharm的问题:
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参数的内容将会出错。
实用效果:
python2的编码问题更多,python3默认utf8还好一些。
