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. javascript - node.js promise沒用2. golang - 用IDE看docker源碼時的小問題3. c++ - 如何正確的使用QWebEngineView?4. yii2中restful配置好后在nginx下報404錯誤5. javascript - js 寫一個正則 提取文本中的數據6. 算法 - python 給定一個正整數a和一個包含任意個正整數的 列表 b,求所有<=a 的加法組合7. android 如何實現如圖中的鍵盤上的公式及edittext的內容展示呢8. java - 我在用Struts2上傳文件時,報以下錯誤怎么回事?9. php自學從哪里開始?10. 有會apicloud 混合開發的朋友嗎?
