导入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)
그저 놀고 싶다면 Python3을 직접 사용하는 것을 고려할 수 있습니다. Python2와 비교할 때 Python3은 문자 인코딩 문제가 훨씬 적습니다.
오류 메시지를 보면 lanxi.py의 인코딩 형식에 문제가 있을 것입니다. 먼저 cmd 콘솔로 이동하여 Python을 실행한 다음 가져오기를 시도하면 됩니다.
SSL 암호화 기능 패키지의 폴더 경로에 특수문자가 있습니다
py3, 2로 변경하면 항상 다양한 코딩 문제가 발생합니다
으아아아
인쇄하여 이 코드의 변수에 중국어 문자가 있는지 확인하거나 모두 유니코드 형식으로 저장할 수 있습니다
으아아아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을 사용하면 모든 것이 괜찮을 것이라고 생각하지 마세요. 문제 해결의 핵심은 인코딩 및 디코딩 방법을 아는 것이며 한 번에 해결할 수 있습니다. 모두.