UnicodeEncodeError : 'charmap'코덱이 문자를 인코딩 할 수 없습니다


205

웹 사이트를 긁으려고하는데 오류가 발생합니다.

다음 코드를 사용하고 있습니다.

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>

이 문제를 해결하려면 어떻게해야합니까?

답변:


257

UnicodeEncodeError스크랩 된 웹 컨텐츠를 파일로 저장할 때도 마찬가지 입니다. 그것을 고치기 위해이 코드를 바꿨습니다.

with open(fname, "w") as f:
    f.write(html)

이것으로 :

import io
with io.open(fname, "w", encoding="utf-8") as f:
    f.write(html)

를 사용 io하면 Python 2와 역 호환됩니다.

Python 3 만 지원해야하는 경우 open대신 내장 함수를 사용할 수 있습니다 .

with open(fname, "w", encoding="utf-8") as f:
    f.write(html)

6
Mac (python 3)에서는 인코딩없이 열면 완벽하게 작동하지만 Windows (w10, python3)는 옵션이 아닙니다. encoding = "utf-8"매개 변수를 사용하는 방식으로 작동합니다.
xtornasol512

3
감사합니다. 내가 XML 파일로 작업하고 새 파일에 xml.toprettyxml ()의 결과를 기록하고, 나를 위해 일한
루이스 카브레라 베니토

1
결과적으로 바이트의 문자열 표현이 아닌 출력에 문자열을 쓰므로 허용되는 대답이어야합니다.
Shirkan 2019

OP가 파일 읽기를 요청했지만 파일을 쓰지 않았습니다. 콘솔 관련 문제인 것 같습니다.
NaturalBornCamper

187

에 추가 .encode("utf-8")하여 수정했습니다 soup.

즉, print(soup)이된다 print(soup.encode("utf-8")).


3
스크립트 내에서 환경 (예 : 콘솔)의 문자 인코딩을 하드 코딩하지 말고 대신 유니 코드를 직접 인쇄
jfs

이것은 UTF-8 인코딩 텍스트가 많은 경우 bytes객체 의 repr을 인쇄하는 것 \x입니다. win_unicode_console@JFSebastian이 제안한 것처럼을 사용하는 것이 좋습니다 .
Eryk Sun

2
위의 솔루션을 사용했지만 문제가 발생했습니다. class MyStreamListener (tweepy.StreamListener) : def on_status (self, status) : print (str (status.encode ( "utf-8"))) UnicodeEncodeError : 'charmap'codec can ' t 인 코드 문자 위치 87 '\ u2019는'문자에 <정의> 맵
비벡

2
이것은 인쇄 만드는 b'\x02x\xc2\xa9'대신 (A 바이트 객체)
MilkyWay90

1
print(soup.encode("utf-8"))나를 위해 일했지만 그 전에 나는 또한 추가해야했다with open("f_name", encoding="utf-8") as f: soup = BeautifulSoup(f, "html.parser")
TheWalkingData

44

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 문자가 발생할 때 오류를 반환하는 대신 텍스트로 변환 할 수 있기 때문입니다. 현재 인코딩으로 제공되지 않습니다.


1
print (soup) return \ xd0 \ xbf \ xd0 \ xbe \ xd0 \ xb6 \ xd0 \ xb0 \ xd0 \ xbb \ xd1 \ x83 \ xd0 \ xb9 \ xd
Coffee inTime

12

get 요청의 응답을 저장하는 동안 창 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)

10

인쇄, 읽기 / 쓰기 또는 열기를 시도 할 때 발생하는 인코딩과 동일한 문제에 직면했습니다. 위에서 언급 한 다른 사람들처럼 .encoding = "utf-8"을 추가하면 인쇄하려고하면 도움이됩니다.

soup.encode ( "utf-8")

스크랩 된 데이터를 열려고 파일에 쓰려고하면 (......, encoding = "utf-8")을 사용하여 파일을여십시오.

csv_file과 같이 open (filename_csv, 'w', newline = '', encoding = "utf-8")


6

여전히이 오류가 발생하는 경우 추가 encode("utf-8")하면 soup이 문제가 해결됩니다.

soup = BeautifulSoup(html_doc, 'html.parser').encode("utf-8")
print(soup)

2
soupBeautifulSoup작업을 수행 한 후에 는 더 이상 개체가 아니므로 조작하거나 검색 할 수 없습니다
NaturalBornCamper
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.