Юникод Python в Google App Engine - PullRequest
0 голосов
/ 20 марта 2012

Я полностью запутался с геей. У меня есть скрипт, который выполняет пост-запрос (используя urlfetch из API App Engine Google), в качестве ответа мы получаем html-страницу в кодировке cp1251.

Затем я декодирую его, используя .decode ('cp1251') и анализирую с lxml.

Мой код прекрасно работает на моей локальной машине:

import re
import leaf #simple wrapper for lxml
weekdaysD={u'понедельник':1, u'вторник':2, u'среда':3, u'четверг':4, u'пятница':5, u'суббота':6}
document = leaf.parse(leaf.strip_symbols(leaf.strip_accents(html_in_cp1251.decode('cp1251'))))
table=document.get('table')
trs=table('tr') #leaf syntax
for tr in trs:
    tds=tr.xpath('td')
    for td in tds:
        if td.colspan=='3':
            curweek=re.findall('\w+(?=\-)', td.text)[0]               
            curday=weekdaysD[td.text.split(u',')[0]]

но при развертывании в gae я получаю:

curday=weekdaysD[td.text.split(u',')[0]]
KeyError: u'\xd0\xb2\xd1\x82\xd0\xbe\xd1\x80\xd0\xbd\xd0\xb8\xd0\xba'

Как там вообще не символы Юникода? И почему все хорошо локально? Я перепробовал все варианты размещения декодирования \ кодирования в моем коде - ничего не помогло. Я застрял на несколько дней.

UPD: также, если я добавлю в свой скрипт на GAE:

print type(weekdaysD.keys()[0]), type(td.text.split(u',')[0]) 

Возвращает оба как «Юникод». Итак, я верю, что HTML был декодирован правильно. Может ли это быть что-то с lxml на GAE?

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Эта строка, которую вы получили в сообщении об ошибке, имеет юникод для своего типа, но на самом деле содержимое является байтами, которые будут кодировкой UTF-8 вторника.Было бы полезно, если бы вы показали нам код, который выполняет вызов urlfetch, поскольку в коде, который вы показываете, нет ничего плохого.

0 голосов
/ 29 марта 2012

Что ж, обходной путь добавления .encode ('latin1'). Decode ('utf-8', 'ignore') сделал свое дело.Хотел бы я объяснить, почему он так себя ведет.

...