У меня возникла ошибка Unicode, когда я попытался экспортировать файл CSV (веб-парсинг, я использую Beautifulsoup и импортировал как CSV, так и Beautifulsoup). Код используется Mac Linux, который вполне поддерживает UTF-8, но я использую Windows. Ошибка отображается как
> UnicodeEncodeError Traceback (most recent call last) in () 71
> 'ranking_title': ranking_title, ---> 72 'ranking_category':
> ranking_category}) 73
>
> ~\Anaconda3\lib\csv.py in writerow(self, rowdict) 154 def
> writerow(self, rowdict): --> 155 return
> self.writer.writerow(self._dict_to_list(rowdict)) 156
>
> ~\Anaconda3\lib\encodings\cp1252.py in encode(self, input, final) 18
> def encode(self, input, final=False): ---> 19 return
> codecs.charmap_encode(input,self.errors,encoding_table)[0] 20
>
> UnicodeEncodeError: 'charmap' codec can't encode characters in
> position 299-309: character maps to
Исходный код, работающий на Mac:
def get_page(url):
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
mainpage = response.read().decode('utf8')
return mainpage
Я попытался декодировать cp1252 и закодировать UTF-8 в начале рабочего листа:
def get_page(url):
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
mainpage = response.read().decode('cp1252').encode('utf8')
return mainpage
Но это не работает, пожалуйста, помогите.
можете ли вы указать URL-адрес используемого вами веб-сайта?
@lenz Большое спасибо. Скоро предоставлю. Теперь у меня другая случайная ошибка.
Угробить urllib.request
. Используйте модуль requests
. Он выполняет все декодирование за вас, и вы можете сосредоточиться на том, что действительно хотели сделать. (Конечно, вы можете повторно реализовать все, что делает requests
, с urllib
. Но для начала вам нужно обратить внимание на заголовок ответа Content-Type
вместо жесткого кодирования одной кодировки. Но действительно ли это ваша цель здесь, или вы действительно хотите скачать и работать с данными?)
@Tomalak, безусловно, прав в том, что requests
в целом упрощает вашу жизнь. Боюсь, что это не решит эту конкретную проблему, потому что расшифровка явно преуспевает (нет UnicodeDecodeError
). Я подозреваю, что вы open
- выходной файл без объявления параметра encoding=
, поэтому Python по умолчанию использует кодек по умолчанию для конкретной платформы «CP-1252», который, по-видимому, не поддерживает все символы в ваших данных.
@Tomalak Да, я хочу только загрузить данные. Я новичок в питоне. Не могли бы вы уточнить больше о «Content-Type»?
@lenz Спасибо. Есть ли у вас какие-либо предлагаемые источники для обучения, чтобы я мог больше узнать о том, как я объявляю кодировку, подходящую для моего рабочего листа.
@Meekao Не могли бы вы просто использовать модуль requests
, как я предлагал?
@lenz Почему бы не решить эту проблему? Сервер объявляет кодировку, модуль запросов ее декодирует. Скорее всего, он просто работает (если сервер не отправляет неправильный тип контента, что я бы сейчас исключил).
@Meekao Для функции open
взгляните на документы. Если вы используете один из кодеков UTF, он будет работать (с их помощью можно кодировать все символы). Если вы планируете позже открыть файл CSV с помощью инструмента Windows, я предлагаю вам использовать «utf-8-sig» или «utf-16».
@Tomalak, потому что похоже, что проблема связана с записью в вывод (CSV), а не с интерпретацией данных. В коде OP нет ошибки декодирования.
Какую версию Python вы используете? И какой инструмент в Windows вы используете для просмотра файла? Например, Notepad ++ полностью поддерживает кодировку utf-8.
@Tomalak Большое спасибо. Я пробовал, но при запуске раздела get_page появляется ошибка атрибута.
@MartinEvans В настоящее время я использую Python 3 с Jupyter-notebook 5.0.0 от Anaconda Navigator. Я новичок в Python, я ответил на ваш вопрос?
@Meekao Вы можете отредактировать исходное сообщение, включив в вопрос начало фрагмента 10 (см. Серую ссылку «изменить» под текстом).
Спасибо всем присутствующим, я очень ценю вашу доброту. Ваша поддержка улучшила мою работу и учебу. Еще раз хочу вас поблагодарить! : D: Томалак, МартинЭванс, the-realtom
UnicodeEncodeError
, с которым вы сталкиваетесь, возникает, когда вы записываете данные в выходной файл CSV.
Как сообщает нам сообщение об ошибке, Python использует кодек charmap, который не поддерживает символы, содержащиеся в ваших данных.
Обычно это происходит, когда вы open
файл без указания параметра кодировки на машине Windows.
В прилагаемом кодовом документе (ссылка на комментарий) фрагмент № 10, мы видим, что это так. Вы написали:
with open('wongnai.csv', 'w', newline='') as record:
fieldnames = ...
В этом случае Python использует кодировку по умолчанию, зависящую от платформы, которая обычно представляет собой 8-битную кодировку на машинах Windows. Укажите кодек, который поддерживает весь Юникод, и запись файла должна завершиться успешно:
with open('wongnai.csv', 'w', newline='', encoding='utf16') as record:
fieldnames = ...
Конечно, вы также можете использовать utf8 или utf32 вместо utf16. UTF-8 очень популярен для сохранения файлов в средах Unix и в Интернете, но если вы планируете позже открыть файл CSV в Excel, вы можете столкнуться с некоторыми проблемами, связанными с тем, чтобы приложение отображало данные должным образом. Более устойчивое к Windows (но технически нестандартное) решение - использовать "utf-8-sig", который добавляет некоторый полумагический символ в начало файла, чтобы помочь программам Windows понять, что это UTF-8.
Работаетссссссс !!!! Большое спасибо. Я ценю ваше время и усилия. Я не могу вас отблагодарить! : D
Не стоит беспокоиться. Я рад, что это помогло.
Похоже, проблема не в том, как вы читаете (декодируете) данные, а в том, как вы их записываете (кодируете, см. Сообщение об ошибке). Функция
get_page
выглядит нормально, но вы должны показать части кода, в которых вы открываете файл для записи вывода CSV.