导入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
그저 놀고 싶다면 Python3을 직접 사용하는 것을 고려할 수 있습니다. Python2와 비교할 때 Python3은 문자 인코딩 문제가 훨씬 적습니다.
阿神2017-04-18 10:36:16
오류 메시지를 보면 lanxi.py의 인코딩 형식에 문제가 있을 것입니다. 먼저 cmd 콘솔로 이동하여 Python을 실행한 다음 가져오기를 시도하면 됩니다.
巴扎黑2017-04-18 10:36:16
UnicodeDecodeError
은 문자 디코딩이 실패하는 이유입니다. 이는 requests
만의 문제도 아니고, python
만의 문제도 아닙니다. , 문자 인코딩을 이해해야 합니다. 정보를 얻기 위해 특정 문자 인코딩을 쿼리할 수 있습니다. 아래 py2
의 문자 인코딩 문제입니다.
py2
안에 따옴표로 선언된 문자열 유형은 모두 str
이고, 문자열 앞에 u
로 선언된 문자열 유형은 unicode
입니다. 네트워크 IO에서 전송되는 문자와 파일 읽기 및 쓰기는 모두 바이트, 즉 str
형식으로 인코딩됩니다. 계산을 수행하기 위해 컴퓨터에 로드하면 일반적으로 unicode
로 디코딩됩니다. py2의 str
메소드는 실제로 ''.encode('ascii')
이고, unicode
메소드는 ''.decode('ascii')
ss = '你好'
은 ascii
이 아닌 문자이기 때문에 ascii
방식으로 디코딩하면 실패합니다. utf-8
및 gbk
로 디코딩하면 성공합니다. 마찬가지로 s=u'你好'
도 ascii
로 인코딩할 수 없습니다.
위의 질문은 ascii
문자가 아닌 문자에 관한 것이어야 하며, decode
가 ascii
문자가 되면 오류가 발생합니다. result_path + p_path
즉, 다음 두 변수 중 하나는 ascii
이 아닌 문자를 포함하는 str
유형입니다.
'你好'
의 한자는 ascii
문자가 아닙니다. 유니코드 문자로 이어붙이면 유니코드로 디코딩된 후 이어집니다. 마지막 예인 '你好' + u'world'
는 실제로 '你好'.decode('ascii') + u'world'
을 실행합니다. 그래서 오류가 보고됩니다.
수정 방법은 매우 간단합니다. 통합 문자 인코딩을 사용하면 됩니다. Linux에서 py의 기본 인코딩은 utf-8이고 win에서는 gbk인 것 같습니다. 어쨌든 utf-8을 사용하십시오.
으아악py3에서는 따옴표로 선언된 모든 문자열이 유니코드입니다. str
, unicode
두 가지 유형이 없습니다. 그 중 str
은 bytes
타입으로 인코딩되고, bytes
는 스트링 타입으로 디코딩된다. 둘 사이를 변환할 때 여전히 UnicodeDecodeError
문제가 있습니다. py3을 사용하면 모든 것이 괜찮을 것이라고 생각하지 마세요. 문제 해결의 핵심은 인코딩 및 디코딩 방법을 아는 것이며 한 번에 해결할 수 있습니다. 모두.