Maison > Questions et réponses > le corps du texte
导入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
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.
阿神2017-04-18 10:36:16
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<🎜. >
大家讲道理2017-04-18 10:36:16
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
高洛峰2017-04-18 10:36:16
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
巴扎黑2017-04-18 10:36:16
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.
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'>