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>
Что я могу сделать, чтобы исправить это?
5 ответ(ов)
Я сталкивался с аналогичной ошибкой 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
.
Я исправил это, добавив .encode("utf-8")
к soup
.
Это значит, что print(soup)
становится print(soup.encode("utf-8"))
.
В 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 и избегать ошибок, возникающих при попытке записи символов, не поддерживаемых текущей кодировкой.
При сохранении ответа на GET-запрос в Python 3.7 на Windows 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)
Когда я добавил параметр encoding="utf-8"
в команду open
, файл сохранился с правильным содержимым:
with open('NiftyList.txt', 'w', encoding="utf-8") as f:
f.write(resp.text)
Таким образом, всегда стоит обращать внимание на кодировку, особенно когда работаете с текстами, чтобы избежать проблем с сохранением данных.
Я также сталкивался с аналогичной проблемой, связанной с кодировкой, когда вы пытаетесь вывести данные, прочитать или записать их, или открыть файл. Как упоминали другие, добавление .encoding="utf-8" поможет, если вы хотите их вывести.
soup.encode("utf-8")
Если вы собираетесь открыть собранные данные и, возможно, записать их в файл, то откройте файл с параметром (......, encoding="utf-8"):
with open(filename_csv, 'w', newline='', encoding="utf-8") as csv_file:
Это должно помочь вам избежать проблем с кодировкой.
UnicodeEncodeError: 'ascii' кодек не может закодировать символ u'\xa0' на позиции 20: номер не в диапазоне (128)
Как скачать файл по HTTP?
Правильный способ записи строки в файл?
Как открыть несколько файлов с помощью "with open" в Python?
Вывод строки в текстовый файл