python 的requests问题
问题描述
导入requests,提示报错 ’’’ UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xc9 in position 1: ordinal not in range(128)’’’问题查了,一般是字符之间转换的。但是到了库这里,就不懂了什么原因。。。。小生愚钝,请教各位老师,请指点一二,麻烦了。
导入BeautifulSoup,它是正常的。下面是报错的具体信息。
PS :不是本专业的,想学习一点计算机方面的。学个爬虫玩玩。英语比较菜。。。
Traceback (most recent call last): File 'F:/untitled29/lianxi.py', line 5, in <module> import requests File 'F:Python27libsite-packagesrequests__init__.py', line 52, in <module> from .packages.urllib3.contrib import pyopenssl File 'F:Python27libsite-packagesrequestspackagesurllib3contribpyopenssl.py', line 47, in <module> from cryptography import x509 File 'F:Python27libsite-packagescryptographyx509__init__.py', line 7, in <module> from cryptography.x509.base import ( File 'F:Python27libsite-packagescryptographyx509base.py', line 16, in <module> from cryptography.x509.extensions import Extension, ExtensionType File 'F:Python27libsite-packagescryptographyx509extensions.py', line 14, in <module> from asn1crypto.keys import PublicKeyInfo File 'F:Python27libsite-packagesasn1cryptokeys.py', line 22, in <module> from ._elliptic_curve import ( File 'F:Python27libsite-packagesasn1crypto_elliptic_curve.py', line 51, in <module> from ._int import inverse_mod File 'F:Python27libsite-packagesasn1crypto_int.py', line 56, in <module> from ._perf._big_num_ctypes import libcrypto File 'F:Python27libsite-packagesasn1crypto_perf_big_num_ctypes.py', line 31, in <module> libcrypto_path = find_library(’crypto’) File 'F:Python27libctypesutil.py', line 51, in find_library fname = os.path.join(directory, name) File 'F:Python27libntpath.py', line 85, in join result_path = result_path + p_pathUnicodeDecodeError: ’ascii’ codec can’t decode byte 0xc9 in position 1: ordinal not in range(128)
问题解答
回答1:如果只是玩一玩的话可以考虑直接使用Python3,比起Python2,Python3的字符编码问题会少很多。
回答2:看你的错误提示应该lanxi.py的编码格式有问题,你可以先到cmd控制台运行python再import试一下,应该不是requests有问题
回答3:ssl 的加密功能包的文件夹路径有特殊字符
换py3吧, 2总有各种各样的编码问题
回答4:result_path = result_path + p_path
这句代码的变量是不是有中文, 你可以都打印出来看看, 或者将它们都以unicode的形式存
result_path = u’xxx’p_path = u’xxx’或者 通过decode函数将变量转成unicode回答5:
UnicodeDecodeError是字符解码失败的原因,这不仅是requests的问题,也不仅是python的问题,所有编程语言都有这样的“问题”,也就是必须要了解字符编码。具体的字符编码可以查询资料。下面py2中的字符编码问题。
py2的用引号声明的字串类型都是str,字串前加一个u声明的才是unicode。网络IO,文件读写中传输的字符都是编码成bytes,即str类型。载入到计算机执行计算,一般都要解码成unicode。py2的str方法实际上是’’.encode(’ascii’), unicode方法是’’.decode(’ascii’)
In [1]: s = u’你好’In [2]: str(s)---------------------------------------------------------------------------UnicodeEncodeErrorTraceback (most recent call last)<ipython-input-2-d22ffcdd2ee9> in <module>()----> 1 str(s)UnicodeEncodeError: ’ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)In [3]: s.decode(’ascii’)---------------------------------------------------------------------------UnicodeEncodeErrorTraceback (most recent call last)<ipython-input-3-735804de5fd4> in <module>()----> 1 s.decode(’ascii’)UnicodeEncodeError: ’ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)In [4]: ss = ’你好’In [5]: unicode(ss)---------------------------------------------------------------------------UnicodeDecodeErrorTraceback (most recent call last)<ipython-input-5-6325006f91c2> in <module>()----> 1 unicode(ss)UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)In [6]: ss.decode(’ascii’)---------------------------------------------------------------------------UnicodeDecodeErrorTraceback (most recent call last)<ipython-input-6-b5dcf2f3b46d> in <module>()----> 1 ss.decode(’ascii’)UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)In [7]: ss.decode(’utf-8’)Out[7]: u’u4f60u597d’In [8]: ss.decode(’gbk’)Out[8]: u’u6d63u72b2u30bd’
因为ss = ’你好’是非ascii字符,因此以ascii方式解码失败,当解码成utf-8和gbk就成功了。同理s=u’你好’也不能编码成ascii的方式。
你上面的问题,应该是非ascii字符,decode成ascii字符的时候抛错。result_path + p_path 即这两个变量中,有一个变量是包含非ascii字符的str类型:
In [1]: ’hello’ + u’world’Out[1]: u’helloworld’In [2]: ’hello’ + u’世界’Out[2]: u’hellou4e16u754c’In [3]: ’你好’ + u’世界’---------------------------------------------------------------------------UnicodeDecodeErrorTraceback (most recent call last)<ipython-input-3-8c1827afc847> in <module>()----> 1 ’你好’ + u’世界’UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)In [4]: ’你好’ + ’世界’Out[4]: ’xe4xbdxa0xe5xa5xbdxe4xb8x96xe7x95x8c’In [5]: ’你好’ + ’世界 world’Out[5]: ’xe4xbdxa0xe5xa5xbdxe4xb8x96xe7x95x8c world’In [6]: ’你好’ + u’世界 world’---------------------------------------------------------------------------UnicodeDecodeErrorTraceback (most recent call last)<ipython-input-6-dcdf837ec675> in <module>()----> 1 ’你好’ + u’世界 world’UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)In [9]: ’你好’ + u’world’---------------------------------------------------------------------------UnicodeDecodeErrorTraceback (most recent call last)<ipython-input-9-1be7bc8e74d5> in <module>()----> 1 ’你好’ + u’world’UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)
’你好’中的中文不是ascii字符,和unicode字符拼接的时候,会解码成unicode再拼接,对于最后的例子,’你好’ + u’world’,其实执行的是 ’你好’.decode(’ascii’) + u’world’,所以就报错。
校正的方式很简单,统一字符编码就好。linux的py默认编码是utf-8,win貌似是gbk。不管怎么样,总之都用utf-8吧。
In [10]: ’你好’.decode(’utf-8’) + u’world’Out[10]: u’u4f60u597dworld’
py3中,所有引号声明的字串都是unicode。也就不存在str和unicode这两种类型。其中str编码成bytes类型,bytes解码成字串类型。两种的相互转换的时候,还是会有 UnicodeDecodeError 问题,不要以为用了py3就能万事大吉,解决的问题关键是知道如何编码解码,就能一劳永逸。
>>> s = ’中文’>>> s.encode(’utf-8’)b’xe4xb8xadxe6x96x87’>>> s.encode(’ascii’)Traceback (most recent call last): File '<stdin>', line 1, in <module>UnicodeEncodeError: ’ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)>>> print(type(s.encode(’utf-8’)))<class ’bytes’>>>> print(type(s))<class ’str’>
相关文章:
1. python - 关于matplotlib的x轴显示的问题2. mysql优化 - mysql慢查询copying to tmp table3. android 文件File删除问题4. javascript - vue生成一维码?求助!!!!!急5. ueditor上传服务器提示后端配置项没有正常加载,求助!!!!!6. css - .clearfix:after中为什么设置display: table7. 请教: 关于 python 反斜杠转义的疑问8. css - transform: translateY(-50%)在360浏览器极速模式下使得文字变模糊了9. angular.js - 怎样在使用ng-repeat属性的标签里面监听单个事件,使其能够单个改变CSS。10. nginx英文文档的WebSocket proxying部分没看太明白,麻烦推荐一点中文文章
