导入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)
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.
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 >
Laluan folder pakej fungsi penyulitan SSL mempunyai aksara khas
Tukar kepada py3, 2 sentiasa mengalami pelbagai masalah pengekodan
Anda boleh mencetaknya untuk melihat sama ada pembolehubah dalam kod ini mempunyai aksara Cina atau simpan semuanya dalam bentuk unikod
Jenis rentetan yang diisytiharkan dengan petikan dalamUnicodeDecodeError
adalah sebab mengapa penyahkodan aksara gagal Ini bukan sahaja masalah denganrequests
, malah bukan sahaja masalah denganpython
Semua bahasa pengaturcaraan mempunyai "masalah" sedemikian , pengekodan aksara mesti difahami. Pengekodan aksara tertentu boleh ditanya untuk mendapatkan maklumat. Masalah pengekodan aksara dalampy2
di bawah.py2
semuanyastr
dan yang diisytiharkan denganu
di hadapan rentetan ialahunicode
. Aksara yang dihantar dalam rangkaian IO dan membaca dan menulis fail semuanya dikodkan ke dalam bait, iaitu jenisstr
. Apabila dimuatkan ke dalam komputer untuk melakukan pengiraan, ia biasanya dinyahkod menjadiunicode
. Kaedahstr
py2 sebenarnya''.encode('ascii')
dan kaedahunicode
ialah''.decode('ascii')
Oleh kerana
ss = '你好'
ialah aksara bukanascii
, penyahkodan dalam caraascii
gagal Apabila dinyahkodkan menjadiutf-8
dangbk
ia berjaya. Begitu juga,s=u'你好'
tidak boleh dikodkan ke dalamascii
.Soalan anda di atas hendaklah mengenai bukan
Aksara Cina dalamascii
aksara dan ralat berlaku apabiladecode
menjadiascii
aksara.result_path + p_path
Iaitu, salah satu daripada dua pembolehubah ini adalah jenisascii
yang mengandungi bukanstr
aksara:'你好'
bukan aksaraascii
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.
Dalam py3, semua rentetan yang diisytiharkan dalam tanda petikan adalah unikod. Tiada dua jenis
str
danunicode
. Antaranya,str
dikodkan kepada jenisbytes
danbytes
dinyahkodkan kepada jenis rentetan. Apabila menukar antara kedua-duanya, masih terdapat masalahUnicodeDecodeError
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.