5

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

16

Я пытаюсь сделать парсинг сайта, но возникла ошибка.

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

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 ответ(ов)

8

Я сталкивался с аналогичной ошибкой 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")).

1

В 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 и избегать ошибок, возникающих при попытке записи символов, не поддерживаемых текущей кодировкой.

0

При сохранении ответа на 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)

Таким образом, всегда стоит обращать внимание на кодировку, особенно когда работаете с текстами, чтобы избежать проблем с сохранением данных.

0

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

soup.encode("utf-8")

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

with open(filename_csv, 'w', newline='', encoding="utf-8") as csv_file:

Это должно помочь вам избежать проблем с кодировкой.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь