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 при сохранении очищенного веб-контента в файл. Чтобы исправить это, я заменил этот код:
withopen(fname, "w") as f: f.write(html)
с помощью этого:
withopen(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), заменив эту строку:
withopen('filename', 'w') as f:
С помощью этого:
withopen('filename', 'w', encoding='utf-8') as f:
Причина, по которой он работает, заключается в том, что при использовании файла кодировка изменяется на UTF-8, поэтому символы в UTF-8 могут быть преобразованы в текст, вместо того, чтобы возвращать ошибку при обнаружении символа UTF-8, который не поддерживается текущей кодировкой.
Ответ 4
set PYTHONIOENCODING=utf-8 set PYTHONLEGACYWINDOWSSTDIO=utf-8
Вам может потребоваться, а может и не потребоваться устанавливать эту вторую переменную окружения PYTHONLEGACYWINDOWSSTDIO.
В качестве альтернативы, это можно сделать в коде (хотя, похоже, рекомендуется делать это через переменные env):
Воспроизведение этой ошибкиДополнительно: было немного затруднительно, поэтому оставим и это здесь на случай, если вам понадобится воспроизвести это на вашем компьютере:
set PYTHONIOENCODING=windows-1252 set PYTHONLEGACYWINDOWSSTDIO=windows-1252