UnicodeEncodeError: 'charmap' 코덱은 문자를 인코딩할 수 없습니다.
웹 사이트를 긁어모으려고 하는데 오류가 나요.
다음 코드를 사용하고 있습니다.
import urllib.request
from bs4 import BeautifulSoup
get = urllib.request.urlopen("https://www.website.com/")
html = get.read()
soup = BeautifulSoup(html)
print(soup)
다음과 같은 에러가 표시됩니다.
File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 70924-70950: character maps to <undefined>
이 문제를 해결하려면 어떻게 해야 하나요?
나도 똑같은 걸 얻었어UnicodeEncodeError스크랩된 웹 콘텐츠를 파일에 저장할 때 사용합니다.수정하기 위해 다음 코드를 교체했습니다.
with open(fname, "w") as f:
f.write(html)
다음과 같이 입력합니다.
with open(fname, "w", encoding="utf-8") as f:
f.write(html)
Python 2를 지원해야 하는 경우 다음을 사용하십시오.
import io
with io.open(fname, "w", encoding="utf-8") as f:
f.write(html)
이외의 되어 있는 는, 「UTF-8」의 합니다.encoding.
를 붙여서 요..encode("utf-8")로로 합니다.soup.
, ②,print(soup) becomes가 되다print(soup.encode("utf-8")).
Python 3.7과 Windows 10을 실행하고 있는 경우, 이것은 동작했습니다(다른 플랫폼이나 Python의 다른 버전에서도 동작할지는 잘 모르겠습니다).
이 행의 치환:
with open('filename', 'w') as f:
이것으로:
with open('filename', 'w', encoding='utf-8') as f:
이 기능이 동작하는 이유는 파일을 사용할 때 인코딩이 UTF-8로 변경되기 때문에 UTF-8의 문자가 현재 인코딩에서 지원되지 않는 UTF-8 문자가 발견되었을 때 오류를 반환하지 않고 텍스트로 변환할 수 있기 때문입니다.
set PYTHONIOENCODING=utf-8
set PYTHONLEGACYWINDOWSSTDIO=utf-8
두 번째 환경변수를 설정할 수도 있고 설정할 필요도 없습니다.
또는 코드로 실행할 수도 있습니다(단, env vars를 통해 실행하는 것이 권장됩니다).
sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')
추가: 이 에러를 재현하는 것은 조금 번거롭기 때문에, 머신상에서 재현할 필요가 있는 경우를 위해서, 이 에러도 여기에 남겨 둡니다.
set PYTHONIOENCODING=windows-1252
set PYTHONLEGACYWINDOWSSTDIO=windows-1252
get request 응답을 저장하는 동안 윈도 10의 Python 3.7에서도 동일한 오류가 발생하였습니다.URL 로부터 수신한 응답은 UTF-8 이므로, 실제로 프로덕션에서 많은 시간을 절약할 수 있기 때문에, 이러한 사소한 문제를 피하기 위해서, 항상 같은 인코딩을 체크하는 것을 추천합니다.
import requests
resp = requests.get('https://en.wikipedia.org/wiki/NIFTY_50')
print(resp.encoding)
with open ('NiftyList.txt', 'w') as f:
f.write(resp.text)
open 명령어로 encoding="utf-8"을 추가했더니 올바른 응답으로 파일이 저장되었습니다.
with open ('NiftyList.txt', 'w', encoding="utf-8") as f:
f.write(resp.text)
인쇄, 읽기/쓰기, 열 때 발생하는 인코딩에 대해서도 같은 문제가 있었습니다.위에서 언급한 것처럼 인쇄하려면 .tw="utf-8"을 추가하는 것이 도움이 됩니다.
soup.subeutf-8")
스크랩된 데이터를 열고 파일에 쓰려는 경우 (........,cap="utf-8")를 눌러 파일을 엽니다.
csv_file로 open(sysv_csv, 'w', newline='', sysv='utf-8')을 지정합니다.
에러가 아직 하고 있는 는, 「」를 합니다.encode("utf-8")로로 합니다.soup을 사용하다
soup = BeautifulSoup(html_doc, 'html.parser').encode("utf-8")
print(soup)
이 문제에는 여러 가지 측면이 있습니다.기본적인 질문은 출력하는 문자 집합입니다.또한 입력 문자 집합을 파악해야 할 수도 있습니다.
하나 포함)print ★★★★★★★★★★★★★★★★★」write를 명시적인 .encoding="..."Python의 내부 유니코드 표현을 해당 인코딩으로 변환합니다.에 그되지 않는 , 「」가 됩니다.UnicodeEncodeError예 western 、 、 、 、 、 、 、 、 、 、 、 、 、 자 anything anything anything anything anything anything anything anything anything anything자자자자자자자 200 인 파일에 이상의 서양 한 것을 것"cp1252"이 8비트 문자 집합에는 이러한 문자를 나타낼 방법이 없기 때문입니다.
기본적으로 거의 모든 레거시 Windows 코드 페이지(437, 850, 1250, 1251 등)를 포함한 모든 8비트 문자 집합에서도 동일한 문제가 발생합니다.단, 일부는 영어 이외의 추가 스크립트(1251은 러시아어, 우크라이나어, 세르비아어, 불가리아어 등)를 지원합니다.8비트 인코딩은 최대 256개의 문자 코드만 가지며, 이 코드에는 포함되지 않은 문자를 나타낼 방법이 없습니다.
아마도 지금이야말로 Joel Spolsky의 The Absolute Minimum Every Software Developer Absolute, 절대적으로 Unicode와 문자 집합에 대해 알아야 합니다(변명 없음).
할 수 는 이 에서는 Unicode를 사용하려고 .printUnicode 문자열에서도 이 오류가 발생하거나 mojibake가 출력될 수 있습니다.이런 걸 보면HéllöHéllö이것은 당신의 문제입니다.
요컨대, 다음 사항을 알아야 합니다.
스크랩한 페이지의 문자 집합 또는 받은 데이터는 무엇입니까?잘 긁혔어요?발신자가 인코딩을 올바르게 식별했습니까?아니면 이 정보를 얻을 수 있습니까(또는 추측할 수 있습니까)?일부 웹 사이트는 페이지에 실제 포함된 문자 집합과 다른 문자 집합을 잘못 선언하고 일부 사이트는 웹 서버와 백엔드 데이터베이스 간의 연결을 잘못 설정했습니다.일부 솔루션에 대한 자세한 예는 올바른 문자 인코딩(피톤 요청 + 아름다운 수프)을 사용하여 스크래치를 참조하십시오.
쓰려는 문자 집합은 무엇입니까?화면에 인쇄하는 경우 단말기가 올바르게 설정되어 있으며 Python 인터프리터가 동일하게 설정되어 있습니까?Windows 콘솔에서 utf-8을 표시하는 방법도 참조하십시오.
이 질문에 대한 답변은 아마 "UTF-8"이 아닐 것입니다.이전의 표준이 ISO-8859-1(라틴-1)이었고, 최근에는 Windows 코드 페이지 1252에도 사용되었지만, 이것은 웹 페이지의 일반적인 인코딩이 되고 있습니다.
앞으로는 기본적으로 일부 프린지 사용 사례를 제외하고 모든 텍스트 데이터를 Unicode로 만들어야 합니다.일반적으로 이것은 UTF-8을 의미합니다만, Windows(또는 Java 호환성이 필요한 경우)에서는 UTF-16이 다소 번거롭지만, 실행 가능한 경우도 있습니다.(다른 Unicode 시리얼라이제이션 형식이 몇 가지 있어 특수한 상황에서 도움이 될 수 있습니다.UTF-32는 기술적으로 사소한 것이지만 훨씬 더 많은 메모리를 차지합니다. UTF-7은 전송에 7비트 ASCII가 필요한 소수의 네트워크 프로토콜에서 사용됩니다.)https://utf8everywhere.org/도 참조해 주세요.
당연히 파일로 인쇄할 경우 파일을 올바르게 표시할 수 있는 도구를 사용하여 해당 파일을 검사해야 합니다.일반적인 파일럿 오류는 현재 선택된 시스템 부호화만 표시하는 도구 또는 부호화를 추측하려고 하지만 잘못된 추측을 하는 도구를 사용하여 파일을 여는 것입니다.또, 를 사용해 의 를 표시했을 에, 를 들면, Windows 의 UTF-8 의 경우는, UTF-8 의 UTF-8 의 UTF-8 의 경우입니다.Héllö서 display display display display로 Héllö.
문자 데이터의 부호화를 알 수 없는 경우는, 그것을 자동적으로 확립하는 간단한 방법이 없습니다.텍스트가 무엇을 나타내야 하는지 알고 있다면 추론할 수 있지만, 이것은 일반적으로 추측을 수반하는 수동 프로세스입니다.(와 같은 자동 툴이 도움이 됩니다만, 잘못 알고 있는 경우도 있습니다.)
보고 있는 인코딩을 특정하기 위해 올바르게 표시되지 않는 문자 내의 개별 바이트를 식별할 수 있는 경우 유용합니다.를 들어 '보다'를 보고 있는 H\x8ell\x9a, 이 은 ""를 나타낼 합니다.Héllö변환 테이블에서 바이트를 검색할 수 있습니다.https://tripleee.github.io/8bit에서 이러한 표를 하나 공개했습니다. 이 예에서는 기존 Mac 8비트 문자 집합 중 하나일 수 있습니다. 데이터 포인트가 많을 경우 그 중 하나로 좁힐 수 있습니다(그렇지 않을 경우, 모든 코드 포인트가 동일한 Uni에 매핑되기 때문에 실제로 사용할 수 있습니다).코드 문자).
대부분의 플랫폼의 Python 3은 모든 입력과 출력에 대해 UTF-8로 기본 설정되지만 Windows에서는 일반적으로 그렇지 않습니다.그 후, 시스템의 디폴트 부호화(일부 Microsoft 문서에서는 「ANSI 코드 페이지」라고 잘못 표기되어 있다)가 디폴트로 되어 있습니다.이는 여러 요인에 따라 달라집니다.서양 시스템에서 기본 인코딩은 일반적으로 Windows 코드 페이지 1252입니다(이전 버전의 Python은 다소 다른 기대를 가지고 있었으며 Python 2에서는 내부 문자열 표현이 Unicode가 아니었습니다).
을는, 의 「UTF-8」, 「UTF-8」, 「UTF-8」을 지정합니다.encoding="utf-8-sig"BOM을 사용하다이것은 엄밀히 말하면 불필요하거나 정확하지 않지만 일부 Windows 도구는 인코딩을 올바르게 식별하기 위해 필요합니다.
앞의 몇 가지 답변에서는 몇 가지 인코딩을 맹목적으로 적용할 것을 제안하고 있습니다만, 이것이 일반적인 접근법이 아닌 방법과 어떤 인코딩을 사용하는지를 이해하는 데 도움이 될 것입니다.
Windows 를 사용하고 있는 경우는, encoding='latin1', encoding='iso-8859-1' 또는 encoding='cp1252' 의 예를 나타냅니다.
csv_data = pd.read_csv(csvpath,encoding='iso-8859-1')
print(print(soup.encode('iso-8859-1')))
언급URL : https://stackoverflow.com/questions/27092833/unicodeencodeerror-charmap-codec-cant-encode-characters
'source' 카테고리의 다른 글
| 플레인 JavaScript에서 "hasClass" 함수는 무엇입니까? (0) | 2022.11.12 |
|---|---|
| CSV를 디스크에 저장하지 않고 CSV 형식의 데이터를 메모리에서 데이터베이스로 전송하려면 어떻게 해야 합니까? (0) | 2022.11.12 |
| PHP의 동적 클래스 메서드 호출 (0) | 2022.11.12 |
| 시간 부분을 사용하지 않고 두 날짜를 비교하려면 어떻게 해야 합니까? (0) | 2022.11.12 |
| 랜덤 컬러 발생기 (0) | 2022.11.12 |