导入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)
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
Vous pouvez les imprimer pour voir si les variables de ce code contiennent des caractères chinois, ou les enregistrer toutes sous forme Unicode
Les types de chaînes déclarés avec des guillemets entreUnicodeDecodeError
est la raison pour laquelle le décodage des caractères échoue. Ce n'est pas seulement un problème avecrequests
, ni seulement un problème avecpython
. 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 danspy2
ci-dessous.py2
sont tousstr
, et ceux déclarés avec unu
devant la chaîne sontunicode
. 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 typestr
. Lorsqu'il est chargé dans l'ordinateur pour effectuer des calculs, il est généralement décodé enunicode
. La méthodestr
de py2 est en fait''.encode('ascii')
, et la méthodeunicode
est''.decode('ascii')
Parce que
ss = '你好'
est un caractère nonascii
, le décodage de la manièreascii
échoue. Lorsqu'il est décodé enutf-8
etgbk
, il réussit. De même,s=u'你好'
ne peut pas être codé dansascii
.Votre question ci-dessus doit concerner des caractères non
Les caractères chinois dansascii
, et une erreur se produit lorsquedecode
devient un caractèreascii
.result_path + p_path
Autrement dit, l'une de ces deux variables est de typeascii
contenant des caractères nonstr
:'你好'
ne sont pas des caractèresascii
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.
Dans py3, toutes les chaînes déclarées entre guillemets sont unicode. Il n'y a pas deux types
str
etunicode
. Parmi eux,str
est codé en typebytes
etbytes
est décodé en type chaîne. Lors de la conversion entre les deux, il y aura toujours desUnicodeDecodeError
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.