546 Stimmen

UnicodeEncodeError: Der Codec 'charmap' kann Zeichen nicht encoden

Ich versuche, eine Website zu scrapen, aber es gibt mir einen Fehler.

Ich benutze den folgenden Code:

import urllib.request
from bs4 import BeautifulSoup

get = urllib.request.urlopen("https://www.website.com/")
html = get.read()

soup = BeautifulSoup(html)

Und ich bekomme den folgenden Fehler:

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 

Was kann ich tun, um das zu beheben?

805voto

twasbrillig Punkte 14254

Ich habe den gleichen UnicodeEncodeError erhalten, als ich gescannten Webinhalt in eine Datei speichern wollte. Um das zu beheben, habe ich diesen Code ersetzt:

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

mit diesem:

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

Wenn Sie Python 2 unterstützen müssen, verwenden Sie dies:

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

Wenn Sie eine andere Codierung als UTF-8 verwenden möchten, geben Sie Ihre tatsächliche Codierung für encoding an.

280voto

SstrykerR Punkte 8452

Ich habe es behoben, indem ich .encode("utf-8") zu soup hinzugefügt habe.

Das bedeutet, dass print(soup) zu print(soup.encode("utf-8")) wird.

99voto

Sabbir Ahmed Punkte 1217

In Python 3.7 und unter Windows 10 hat dies funktioniert (Ich bin mir nicht sicher, ob es auf anderen Plattformen und/oder anderen Versionen von Python funktioniert) Ersetzen Sie diese Zeile:

with open('Dateiname', 'w') as f:

Mit diesem:

with open('Dateiname', 'w', encoding='utf-8') as f:

Der Grund, warum es funktioniert, liegt darin, dass die Codierung auf UTF-8 geändert wird, wenn die Datei verwendet wird. So können Zeichen in UTF-8 in Text umgewandelt werden, anstatt einen Fehler zurückzugeben, wenn es auf ein UTF-8-Zeichen stößt, das von der aktuellen Codierung nicht unterstützt wird.

75voto

Voy Punkte 3906
set PYTHONIOENCODING=utf-8
set PYTHONLEGACYWINDOWSSTDIO=utf-8

Sie müssen möglicherweise die zweite Umgebungsvariable PYTHONLEGACYWINDOWSSTDIO setzen.

Alternativ kann dies im Code erfolgen (obwohl es empfohlen wird, dies über Umgebungsvariablen zu tun):

sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')

Zusätzlich: Die Reproduktion dieses Fehlers war ein wenig mühsam, daher lasse ich dies hier stehen, falls Sie es auf Ihrem Computer reproduzieren müssen:

set PYTHONIOENCODING=windows-1252
set PYTHONLEGACYWINDOWSSTDIO=windows-1252

21voto

Abhishek Jain Punkte 2833

Beim Speichern der Antwort des GET-Anforderung wurde der gleiche Fehler auf Python 3.7 unter Windows 10 geworfen. Die Antwort, die von der URL empfangen wurde, hatte eine Codierung von UTF-8, daher wird immer empfohlen, die Codierung zu überprüfen, damit das gleiche zur Vermeidung solcher belangloser Probleme übergeben werden kann, da dies in der Produktion wirklich viel Zeit kostet.

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)

Als ich encoding="utf-8" mit dem Befehl open hinzugefügt habe, wurde die Datei mit der korrekten Antwort gespeichert

with open ('NiftyList.txt', 'w', encoding="utf-8") as f:
    f.write(resp.text)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X