2014-11-23 3 views
36

Я пытаюсь очистить сайт, но это дает мне ошибку.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> 

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

ответ

69

Я установил его, добавив .encode("utf-8") в soup.

Это означает, что print(soup) будет print(soup.encode("utf-8")).

+1

не кодируйте кодировку символов вашей среды (например, консоль) внутри вашего скрипта, [прямо напечатайте Unicode вместо этого] (http://stackoverflow.com/a/32176732/4279) – jfs

+0

Это просто печать объявления объекта 'bytes', который будет печататься как беспорядок последовательностей' \ x', если есть много кодированного текста в формате UTF-8. Я рекомендую использовать 'win_unicode_console', как предлагает @ J.F.Sebastian. – eryksun

+0

Я использовал вышеупомянутое решение, но возникли проблемы: класс MyStreamListener (tweepy.StreamListener): def on_status (self, status): print (str (status.encode ("utf-8"))) UnicodeEncodeError: 'charmap 'codec не может кодировать символ' \ u2019 'в позиции 87: символьные карты в Vivek

1

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

soup = BeautifulSoup(html_doc, 'html.parser').encode("ascii") 
print(soup) 
34

я получал один и тот же 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 вместо.

+1

В mac (python 3) отлично работает с открытым без кодирования, но в windows (w10, python3) не является вариантом. Просто работает таким образом, с параметром encoding = "utf-8". – xtornasol512

+2

Спасибо. Это сработало для меня, я работал с файлами xml и записывал результат xml.toprettyxml() в новый файл –