Rumah > Soal Jawab > teks badan
导入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:\Python27\lib\site-packages\requests\__init__.py", line 52, in <module>
from .packages.urllib3.contrib import pyopenssl
File "F:\Python27\lib\site-packages\requests\packages\urllib3\contrib\pyopenssl.py", line 47, in <module>
from cryptography import x509
File "F:\Python27\lib\site-packages\cryptography\x509\__init__.py", line 7, in <module>
from cryptography.x509.base import (
File "F:\Python27\lib\site-packages\cryptography\x509\base.py", line 16, in <module>
from cryptography.x509.extensions import Extension, ExtensionType
File "F:\Python27\lib\site-packages\cryptography\x509\extensions.py", line 14, in <module>
from asn1crypto.keys import PublicKeyInfo
File "F:\Python27\lib\site-packages\asn1crypto\keys.py", line 22, in <module>
from ._elliptic_curve import (
File "F:\Python27\lib\site-packages\asn1crypto\_elliptic_curve.py", line 51, in <module>
from ._int import inverse_mod
File "F:\Python27\lib\site-packages\asn1crypto\_int.py", line 56, in <module>
from ._perf._big_num_ctypes import libcrypto
File "F:\Python27\lib\site-packages\asn1crypto\_perf\_big_num_ctypes.py", line 31, in <module>
libcrypto_path = find_library('crypto')
File "F:\Python27\lib\ctypes\util.py", line 51, in find_library
fname = os.path.join(directory, name)
File "F:\Python27\lib\ntpath.py", line 85, in join
result_path = result_path + p_path
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc9 in position 1: ordinal not in range(128)
PHP中文网2017-04-18 10:36:16
Jika anda hanya mahu bermain-main, anda boleh mempertimbangkan untuk menggunakan Python3 secara terus Berbanding dengan Python2, Python3 akan mempunyai lebih sedikit masalah pengekodan aksara.
阿神2017-04-18 10:36:16
Melihat mesej ralat anda, mungkin terdapat masalah dengan format pengekodan lanxi.py Anda boleh pergi ke konsol cmd dan menjalankan python dan kemudian import untuk mencuba >
大家讲道理2017-04-18 10:36:16
Laluan folder pakej fungsi penyulitan SSL mempunyai aksara khas
Tukar kepada py3, 2 sentiasa mengalami pelbagai masalah pengekodan
高洛峰2017-04-18 10:36:16
result_path = result_path + p_path
Anda boleh mencetaknya untuk melihat sama ada pembolehubah dalam kod ini mempunyai aksara Cina atau simpan semuanya dalam bentuk unikod
result_path = u'xxx'
p_path = u'xxx'
或者 通过decode函数将变量转成unicode
巴扎黑2017-04-18 10:36:16
UnicodeDecodeError
adalah sebab mengapa penyahkodan aksara gagal Ini bukan sahaja masalah dengan requests
, malah bukan sahaja masalah dengan python
Semua bahasa pengaturcaraan mempunyai "masalah" sedemikian , pengekodan aksara mesti difahami. Pengekodan aksara tertentu boleh ditanya untuk mendapatkan maklumat. Masalah pengekodan aksara dalam py2
di bawah.
py2
semuanya str
dan yang diisytiharkan dengan u
di hadapan rentetan ialah unicode
. Aksara yang dihantar dalam rangkaian IO dan membaca dan menulis fail semuanya dikodkan ke dalam bait, iaitu jenis str
. Apabila dimuatkan ke dalam komputer untuk melakukan pengiraan, ia biasanya dinyahkod menjadi unicode
. Kaedah str
py2 sebenarnya ''.encode('ascii')
dan kaedah unicode
ialah ''.decode('ascii')
In [1]: s = u'你好'
In [2]: str(s)
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (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')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (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)
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (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')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (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'\u4f60\u597d'
In [8]: ss.decode('gbk')
Out[8]: u'\u6d63\u72b2\u30bd'
Oleh kerana ss = '你好'
ialah aksara bukanascii
, penyahkodan dalam cara ascii
gagal Apabila dinyahkodkan menjadi utf-8
dan gbk
ia berjaya. Begitu juga, s=u'你好'
tidak boleh dikodkan ke dalam ascii
.
Soalan anda di atas hendaklah mengenai bukanascii
aksara dan ralat berlaku apabila decode
menjadi ascii
aksara. result_path + p_path
Iaitu, salah satu daripada dua pembolehubah ini adalah jenis ascii
yang mengandungi bukanstr
aksara:
In [1]: 'hello' + u'world'
Out[1]: u'helloworld'
In [2]: 'hello' + u'世界'
Out[2]: u'hello\u4e16\u754c'
In [3]: '你好' + u'世界'
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (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]: '\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'
In [5]: '你好' + '世界 world'
Out[5]: '\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c world'
In [6]: '你好' + u'世界 world'
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (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'
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (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)
Aksara Cina dalam '你好'
bukan aksara ascii
Apabila disambung dengan aksara unikod, ia akan dinyahkodkan menjadi unikod dan kemudian disambungkan Untuk contoh terakhir, '你好' + u'world'
, sebenarnya melaksanakan '你好'.decode('ascii') + u'world'
. jadi ralat dilaporkan.
Kaedah pembetulan sangat mudah, hanya gunakan pengekodan aksara bersatu. Pengekodan lalai py dalam Linux ialah utf-8, dan nampaknya gbk dalam win. Walau apa pun, gunakan utf-8 pula.
In [10]: '你好'.decode('utf-8') + u'world'
Out[10]: u'\u4f60\u597dworld'
Dalam py3, semua rentetan yang diisytiharkan dalam tanda petikan adalah unikod. Tiada dua jenis str
dan unicode
. Antaranya, str
dikodkan kepada jenis bytes
dan bytes
dinyahkodkan kepada jenis rentetan. Apabila menukar antara kedua-duanya, masih terdapat masalah UnicodeDecodeError
Jangan fikir semuanya akan baik-baik saja dengan py3. Kunci untuk menyelesaikan masalah ialah mengetahui cara mengekod dan menyahkod, dan anda boleh menyelesaikannya sekali semua.
>>> s = '中文'
>>> s.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> 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'>