python 的requests問題
問題描述
導(dǎo)入requests,提示報(bào)錯(cuò) ’’’ UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xc9 in position 1: ordinal not in range(128)’’’問題查了,一般是字符之間轉(zhuǎn)換的。但是到了庫(kù)這里,就不懂了什么原因。。。。小生愚鈍,請(qǐng)教各位老師,請(qǐng)指點(diǎn)一二,麻煩了。
導(dǎo)入BeautifulSoup,它是正常的。下面是報(bào)錯(cuò)的具體信息。
PS :不是本專業(yè)的,想學(xué)習(xí)一點(diǎn)計(jì)算機(jī)方面的。學(xué)個(gè)爬蟲玩玩。英語比較菜。。。
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的字符編碼問題會(huì)少很多。
回答2:看你的錯(cuò)誤提示應(yīng)該lanxi.py的編碼格式有問題,你可以先到cmd控制臺(tái)運(yùn)行python再import試一下,應(yīng)該不是requests有問題
回答3:ssl 的加密功能包的文件夾路徑有特殊字符
換py3吧, 2總有各種各樣的編碼問題
回答4:result_path = result_path + p_path
這句代碼的變量是不是有中文, 你可以都打印出來看看, 或者將它們都以u(píng)nicode的形式存
result_path = u’xxx’p_path = u’xxx’或者 通過decode函數(shù)將變量轉(zhuǎn)成unicode回答5:
UnicodeDecodeError是字符解碼失敗的原因,這不僅是requests的問題,也不僅是python的問題,所有編程語言都有這樣的“問題”,也就是必須要了解字符編碼。具體的字符編碼可以查詢資料。下面py2中的字符編碼問題。
py2的用引號(hào)聲明的字串類型都是str,字串前加一個(gè)u聲明的才是unicode。網(wǎng)絡(luò)IO,文件讀寫中傳輸?shù)淖址际蔷幋a成bytes,即str類型。載入到計(jì)算機(jī)執(zhí)行計(jì)算,一般都要解碼成unicode。py2的str方法實(shí)際上是’’.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’
因?yàn)閟s = ’你好’是非ascii字符,因此以ascii方式解碼失敗,當(dāng)解碼成utf-8和gbk就成功了。同理s=u’你好’也不能編碼成ascii的方式。
你上面的問題,應(yīng)該是非ascii字符,decode成ascii字符的時(shí)候拋錯(cuò)。result_path + p_path 即這兩個(gè)變量中,有一個(gè)變量是包含非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字符拼接的時(shí)候,會(huì)解碼成unicode再拼接,對(duì)于最后的例子,’你好’ + u’world’,其實(shí)執(zhí)行的是 ’你好’.decode(’ascii’) + u’world’,所以就報(bào)錯(cuò)。
校正的方式很簡(jiǎn)單,統(tǒng)一字符編碼就好。linux的py默認(rèn)編碼是utf-8,win貌似是gbk。不管怎么樣,總之都用utf-8吧。
In [10]: ’你好’.decode(’utf-8’) + u’world’Out[10]: u’u4f60u597dworld’
py3中,所有引號(hào)聲明的字串都是unicode。也就不存在str和unicode這兩種類型。其中str編碼成bytes類型,bytes解碼成字串類型。兩種的相互轉(zhuǎn)換的時(shí)候,還是會(huì)有 UnicodeDecodeError 問題,不要以為用了py3就能萬事大吉,解決的問題關(guān)鍵是知道如何編碼解碼,就能一勞永逸。
>>> 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’>
相關(guān)文章:
1. javascript - 為什么我的vue里的router-link不起作用2. javascript - 求助Angular 跨控制器調(diào)用方法可行嗎?3. CSS更改未得到反映。為什么?4. 用戶在微信小程序支付成功以后,財(cái)務(wù)在微信支付后臺(tái)用交易單號(hào)能查到這筆訂單 但財(cái)務(wù)說錢沒有入對(duì)公賬號(hào)?5. javascript - node redirect重定向失敗6. javascript - JS使用ele.style.backgoundImage = ’’ =’none’取消背景圖片都無效7. a標(biāo)簽跨域下載文件能否重命名?8. android - weex 項(xiàng)目createInstanceReferenceError: Vue is not defined9. javascript - 如圖,百度首頁,查看源代碼為什么什么都沒有?10. pdo 寫入到數(shù)據(jù)庫(kù)的內(nèi)容為中文的時(shí)候?qū)懭雭y碼
