UnicodeEncodeError Google App Engine - PullRequest
       0

UnicodeEncodeError Google App Engine

3 голосов
/ 30 июня 2010

Мне очень знакомо:

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xe8' в позиции 24: порядковый номер не в диапазоне (128)

Я проверил несколько сообщений на SO, и они рекомендуют - variable.encode ('ascii', 'ignore')

однако, это не работает. Даже после этого я получаю ту же ошибку ...

Трассировка стека:

'ascii' codec can't encode character u'\x92' in position 18: ordinal not in range(128)
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 513, in __call__
    handler.post(*groups)
  File "/base/data/home/apps/autominer1/1.343038273644030157/siteinfo.py", line 2160, in post
    imageAltTags.append(str(image["alt"]))
UnicodeEncodeError: 'ascii' codec can't encode character u'\x92' in position 18: ordinal not in range(128)

Код, отвечающий за то же:

siteUrl = urlfetch.fetch("http://www."+domainName, headers = { 'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5' } )


 webPage = siteUrl.content.decode('utf-8', 'replace').encode('ascii', 'replace')


 htmlDom = BeautifulSoup(webPage)

 imageTags = htmlDom.findAll('img', { 'alt' : True } )


 for image in imageTags :
                        if len(image["alt"]) > 3 :
                                imageAltTags.append(str(image["alt"]))

Любая помощь будет принята с благодарностью. Благодарю.

1 Ответ

8 голосов
/ 01 июля 2010

Существуют две разные вещи, которые Python рассматривает как строки: «необработанные» строки и строки «Юникод».Только последние фактически представляют текст.Если у вас есть необработанная строка, и вы хотите обрабатывать ее как текст, сначала вам нужно преобразовать ее в строку в кодировке Юникод.Чтобы сделать это, вам нужно знать кодировку для строки - чтобы кодовые точки Unicode представлялись в виде байтов в необработанной строке, и вызывать .decode (encoding) для необработанной строки.

Когда вы вызываете str () в строке юникода происходит обратное преобразование - Python кодирует строку юникода в байтах.Если вы не задаете набор символов, по умолчанию используется ascii, который может представлять только первые 128 кодовых точек.

Вместо этого вам следует выполнить одно из двух действий:

  • Представьте 'imageAltTags' как список строк Unicode, и, таким образом, дамп вызова str () - это, вероятно, лучший подход
  • Вместо str (x), вызовите x.encode (encoding).Используемая кодировка будет зависеть от того, что вы делаете, но наиболее вероятным вариантом является utf-8 - например, x.encode ('utf-8').
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...