python 的requests问题
迷茫
迷茫 2017-04-18 10:34:16
0
5
1013

导入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)
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(5)
Ty80

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

小葫芦
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
巴扎黑

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.

Jenis rentetan yang diisytiharkan dengan petikan dalam

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'>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan