Вопрос-Ответ

UnicodeEncodeError: 'charmap' codec can't encode characters

UnicodeEncodeError: кодек 'charmap' не может кодировать символы

Я пытаюсь очистить веб-сайт, но он выдает ошибку.

Я использую следующий код:

import urllib.request
from bs4 import BeautifulSoup

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

soup = BeautifulSoup(html)

И я получаю следующую ошибку:

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>

Что я могу сделать, чтобы это исправить?

Переведено автоматически
Ответ 1

Я получал то же самое 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.

Ответ 2

Я исправил это, добавив .encode("utf-8") в soup.

Это означает, что print(soup) становится print(soup.encode("utf-8")).

Ответ 3

В 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, который не поддерживается текущей кодировкой.

Ответ 4
set PYTHONIOENCODING=utf-8
set PYTHONLEGACYWINDOWSSTDIO=utf-8

Вам может потребоваться, а может и не потребоваться устанавливать эту вторую переменную окружения PYTHONLEGACYWINDOWSSTDIO.

В качестве альтернативы, это можно сделать в коде (хотя, похоже, рекомендуется делать это через переменные env):

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

Воспроизведение этой ошибки Дополнительно: было немного затруднительно, поэтому оставим и это здесь на случай, если вам понадобится воспроизвести это на вашем компьютере:

set PYTHONIOENCODING=windows-1252
set PYTHONLEGACYWINDOWSSTDIO=windows-1252
python beautifulsoup