Google应用程序引擎中的Python unicode行为

Google应用程序引擎中的Python unicode行为,python,google-app-engine,unicode,cp1251,Python,Google App Engine,Unicode,Cp1251,我完全被盖伊搞糊涂了。我有一个脚本,它执行post请求(使用来自Google App Engine api的urlfetch)作为响应,我们得到一个cp1251编码的html页面 然后我使用.decode('cp1251')对其进行解码,并使用lxml进行解析 我的代码在本地机器上运行完全正常: import re import leaf #simple wrapper for lxml weekdaysD={u'понедельник':1, u'вторник':2, u'среда':3,

我完全被盖伊搞糊涂了。我有一个脚本,它执行post请求(使用来自Google App Engine api的urlfetch)作为响应,我们得到一个cp1251编码的html页面

然后我使用.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'
非unicode字符是如何存在的?为什么当地一切都好? 我已经尝试了解码\编码的所有变体,并将其放入我的代码中-没有任何帮助。 我现在被困了几天

UPD:另外,如果我在GAE上添加脚本:

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

它以“unicode”的形式返回这两个字符。所以,我相信html的解码是正确的。可能是GAE上的lxml吗?

在错误消息中得到的字符串的类型为unicode,但内容实际上是字节,这将是of theturцццimk_的UTF-8编码。如果您向我们展示了执行urlfetch调用的代码,这将非常有帮助,因为您所展示的代码没有任何错误。

好吧,添加.encode('latin1')。decode('utf-8','ignore')的解决方法就成功了。我希望我能解释一下它为什么会这样。

看起来您不知何故获得的页面是UTF-8而不是CP1251。它可能在嗅探用户代理,尽管我从未见过一个站点这样做来确定它使用的编码。不,使用.decode('utf-8')而不是给出:UnicodeDecodeError:'utf8'编解码器无法解码位置286:invalid start byteWell中的字节0xc1,如果您获取给出错误的字符串并执行
s.encode('latin1')。decode('utf-8'))
,您将获得正确的字符串。所以编码有问题-可能是lxml。您的文件是否以PEP 263源代码标记开头?我猜您的本地安装采用的是cp1251编码,而App Engine采用的是ASCII编码。源代码本身是UTF-8,我已经设置了:#--coding:UTF-8。从s.encode('latin1')。decode('utf-8')-这可能是一个解决办法-至少我在那个地方不再遇到同样的错误。但我还有一些-我会检查我能做什么。以下是urlfetch代码:
def get_schedule_week(self,message,data):result=urlfetch.fetch(url=url,payload=data,method=urlfetch.POST,headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','User-Agent':'Mozilla/5.0(Windows NT 6.1;rv:11.0)Gecko/20100101 Firefox/11.0'})如果result.status\u code==200:return result.content
返回的响应是问题中所述的cp1251中的html\u,您能帮我一个忙并记录result.content.\uu class\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu您可能希望日志是repr(result.content)--在这两种情况下都应该相同。但可能字符串太长;可能是repr(result.content[:500])?对不起,我花了这么长时间。这是本地输出(一切正常):
result.content.\uu class\u:
repr(result.content):“\r\n\r\n\r\n\t\r\n\t这是应用程序引擎的一种形式(完全相同):
result.content.\uu class\uu:
repr(result.content):”\r\n\r\n\t\r\n\t这可能是lxml的问题吗?我看不出它不起作用的任何其他原因。