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

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

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

répondre à tous(5)
Ty80

Si vous voulez juste jouer, vous pouvez envisager d'utiliser Python3 directement. Par rapport à Python2, Python3 aura beaucoup moins de problèmes d'encodage de caractères.

阿神

En regardant votre message d'erreur, il devrait y avoir un problème avec le format d'encodage de lanxi.py. Vous pouvez d'abord accéder à la console cmd et exécuter Python, puis importer pour essayer. Cela ne devrait pas être un problème avec les requêtes

大家讲道理

Le chemin du dossier du package de fonctions de cryptage SSL comporte des caractères spéciaux

Changement vers py3, 2 a toujours divers problèmes de codage

小葫芦
result_path = result_path + p_path 

Vous pouvez les imprimer pour voir si les variables de ce code contiennent des caractères chinois, ou les enregistrer toutes sous forme Unicode

result_path = u'xxx'
p_path = u'xxx'
或者 通过decode函数将变量转成unicode
巴扎黑

UnicodeDecodeError est la raison pour laquelle le décodage des caractères échoue. Ce n'est pas seulement un problème avec requests, ni seulement un problème avec python. Tous les langages de programmation ont un tel "problème", c'est-à-dire. , le codage des caractères doit être compris. Le codage de caractères spécifique peut être interrogé pour obtenir des informations. Problème d'encodage des caractères dans py2 ci-dessous.

Les types de chaînes déclarés avec des guillemets entre

py2 sont tous str, et ceux déclarés avec un u devant la chaîne sont unicode. Les caractères transmis dans les E/S réseau et la lecture et l'écriture de fichiers sont tous codés en octets, c'est-à-dire en type str. Lorsqu'il est chargé dans l'ordinateur pour effectuer des calculs, il est généralement décodé en unicode. La méthode str de py2 est en fait ''.encode('ascii'), et la méthode unicode est ''.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'

Parce que ss = '你好' est un caractère non ascii, le décodage de la manière ascii échoue. Lorsqu'il est décodé en utf-8 et gbk, il réussit. De même, s=u'你好' ne peut pas être codé dans ascii.

Votre question ci-dessus doit concerner des caractères non ascii, et une erreur se produit lorsque decode devient un caractère ascii. result_path + p_path Autrement dit, l'une de ces deux variables est de type ascii contenant des caractères non str :

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)
Les caractères chinois dans

'你好' ne sont pas des caractères ascii lorsqu'ils sont associés à des caractères Unicode, ils seront décodés en Unicode puis épissés. Pour le dernier exemple, '你好' + u'world', exécute en fait '你好'.decode('ascii') + u'world', donc une erreur est signalée.

La méthode de correction est très simple, il suffit d'utiliser un codage de caractères unifié. Le codage par défaut de py sous Linux est utf-8, et il semble que ce soit gbk dans win. Quoi qu’il en soit, utilisez quand même utf-8.

In [10]: '你好'.decode('utf-8') + u'world'
Out[10]: u'\u4f60\u597dworld'

Dans py3, toutes les chaînes déclarées entre guillemets sont unicode. Il n'y a pas deux types str et unicode. Parmi eux, str est codé en type bytes et bytes est décodé en type chaîne. Lors de la conversion entre les deux, il y aura toujours des UnicodeDecodeError problèmes. Ne pensez pas que tout ira bien avec py3. La clé pour résoudre le problème est de savoir comment encoder et décoder, et vous pouvez le résoudre une fois pour toutes. tous.

>>> 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'>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal