UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xa0' в позиции 20: порядковый номер не в диапазоне (128) - PullRequest
1164 голосов
/ 30 марта 2012

У меня проблемы с работой символов юникода из текста, полученного с разных веб-страниц (на разных сайтах). Я использую BeautifulSoup.

Проблема в том, что ошибка не всегда воспроизводима; иногда он работает с некоторыми страницами, а иногда он бросает UnicodeEncodeError. Я перепробовал практически все, что мог придумать, и все же я не нашел ничего, что работало бы последовательно, не выдавая какую-то ошибку, связанную с Unicode.

Один из разделов кода, который вызывает проблемы, показан ниже:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

Вот трассировка стека, созданная для НЕКОТОРЫХ строк при выполнении приведенного выше фрагмента:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

Я подозреваю, что это связано с тем, что некоторые страницы (или, в частности, страницы с некоторых сайтов) могут быть закодированы, а другие могут быть не закодированы. Все сайты базируются в Великобритании и предоставляют данные, предназначенные для потребления в Великобритании - поэтому нет проблем, связанных с интернализацией или работой с текстом, написанным на чем-либо, кроме английского.

У кого-нибудь есть идеи, как решить эту проблему, чтобы я ПОСТОЯННО исправил эту проблему?

Ответы [ 27 ]

1 голос
/ 12 марта 2016

У меня только что возникла эта проблема, и Google привел меня сюда, поэтому, чтобы добавить здесь общие решения, вот что сработало для меня:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

У меня появилась эта идея после прочтения презентации Неда .

Я не утверждаю, что полностью понимаю, почему это работает. Поэтому, если кто-то может отредактировать этот ответ или добавить комментарий, чтобы объяснить, я буду признателен.

0 голосов
/ 05 июля 2019

Старайтесь избегать преобразования переменной в str (переменную).Иногда это может вызвать проблему.

Простой совет, который следует избегать:

try: 
    data=str(data)
except:
    data = str(data)

Приведенный выше пример решит также Encode erro.

0 голосов
/ 16 апреля 2019

Увы, это работает как минимум в Python 3 ...

Python 3

Иногда ошибка заключается в переменных окружения ипоэтому

import os
import locale
os.environ["PYTHONIOENCODING"] = "utf-8"
myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8")
... 
print(myText.encode('utf-8', errors='ignore'))

, где ошибки игнорируются при кодировании.

0 голосов
/ 27 января 2019

У меня возникла эта проблема при попытке вывести символы Юникода в stdout, но с sys.stdout.write вместо печати (чтобы я мог также поддерживать вывод в другой файл).

Из собственной документации BeautifulSoup я решил эту проблему с помощью библиотеки кодеков:

import sys
import codecs

def main(fIn, fOut):
    soup = BeautifulSoup(fIn)
    # Do processing, with data including non-ASCII characters
    fOut.write(unicode(soup))

if __name__ == '__main__':
    with (sys.stdin) as fIn: # Don't think we need codecs.getreader here
        with codecs.getwriter('utf-8')(sys.stdout) as fOut:
            main(fIn, fOut)
0 голосов
/ 03 января 2019

Многие ответы здесь (например, @agf и @Andbdrew) уже затронули самые непосредственные аспекты вопроса ОП.

Однако я думаю, что есть один тонкий, но важный аспект, который в значительной степени игнорируется иэто очень важно для всех, кто, как я, попал сюда, пытаясь разобраться в кодировках в Python: Python 2 по сравнению с Python 3 управление представлением символов совершенно отличается .Я чувствую, что большая неразбериха связана с людьми, которые читают о кодировках в Python, не зная версии.

Я предлагаю всем, кто заинтересован в понимании первопричины проблемы OP, начать с прочтения введения Spolsky в представления символов и Unicode, а затем перейти к Batchelder в Unicode в Python2 и Python 3.

0 голосов
/ 25 декабря 2018

Обновление для Python 3.0 и выше.Попробуйте в редакторе python следующее:

locale-gen en_US.UTF-8
export LANG=en_US.UTF-8 LANGUAGE=en_US.en
LC_ALL=en_US.UTF-8

Устанавливает кодировку локали системы по умолчанию в формате UTF-8.

Больше можно прочитать здесь, в PEP 538- Приведение устаревшей локали C к локали на основе UTF-8 .

0 голосов
/ 15 марта 2018

Если у вас есть что-то вроде packet_data = "This is data", сделайте это на следующей строке, сразу после инициализации packet_data:

unic = u''
packet_data = unic
...