it-roy-ru.com

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>

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

114
SstrykerR

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

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

142
SstrykerR

Я получал то же 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)
127
twasbrillig

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

23
Sabbir Ahmed

При сохранении ответа на запрос get та же ошибка была выдана Python 3.7 в окне 10. Ответ, полученный от 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)

Когда я добавил кодировку = "utf-8" командой open, он сохранил файл с правильным ответом

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

Для тех, кто все еще получает эту ошибку, добавление encode("utf-8") к soup также исправит это.

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

Даже я столкнулся с той же проблемой с кодировкой, которая возникает, когда вы пытаетесь распечатать, прочитать/написать или открыть ее. Как уже упоминалось выше, добавление .encoding = "utf-8" поможет, если вы пытаетесь его распечатать.

soup.encode ( "UTF-8")

Если вы пытаетесь открыть очищенные данные и, возможно, записать их в файл, откройте файл с помощью (......, encoding = "utf-8")

с открытым (filename_csv, 'w', newline = '', encoding = "utf-8") как csv_file:

2
Pardhu Gopalam