2012-03-20 13 views
0

私はgaeと完全に混同しました。私は、私たちがcp1251でエンコードされたhtmlページを受け取ったという応答として、(Google App Engine APIからurlfetchを使って)ポストリクエストを行うスクリプトを持っています。Google App EngineのPython unicodeの動作

次に、.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文字がすべてですか?そして、なぜすべてがローカルでOKですか? 私のコードにデコード\エンコードのすべてのバリエーションを試しました。何も助けられませんでした。 私は数日間立ち往生しています。

UPD:私はGAE上で私のスクリプトに追加した場合も、

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

それは 'ユニコード' との両方を返します。だから、私はhtmlが正しく解読されたと信じています。 GAEにlxmlの何かがありますか?

+0

CP1251ではなくUTF-8としてページを取得しているようです。ユーザーエージェントを盗聴している可能性がありますが、使用しているエンコーディングを決定するサイトは見たことがありません。 –

+0

代わりに.decode( 'utf-8')を使用すると、次のようになります。UnicodeDecodeError: 'utf8'コーデックは286の位置で0xc1バイトをデコードできません:無効な開始バイト – stachern

+0

エラーを返す文字列を's.encode( 'latin1')。decode( 'utf-8')'、正しい文字列を取得します。だから何かがエンコーディングを間違って取得している - それはlxmlすることができます。 –

答えて

0

まあ、.encode( 'latin1').deode( 'utf-8'、 'ignore')を追加するのは、このトリックでした。私はなぜそれがそうするのか説明することができたらいいと思う。

+0

.encodeをコードのどの部分に追加するかは、そのトリックですか? – Praxiteles

1

エラーメッセージに表示された文字列には、そのタイプのユニコードが含まれていますが、内容は実際には0xffのUTF-8エンコードになるバイトです。あなたが表示しているコードに何も問題がないので、urlfetch呼び出しを行うコードを示しておけば役に立ちます。

+0

ここのURLfetchコードがある: 'DEF get_schedule_week(自己、メッセージ、データ): 結果= urlfetch.fetch(URL = URL、 ペイロード=データ、 方法= urlfetch.POST、 ヘッダー= { '受け入れます': ' 「ユーザーエージェント」:「Mozilla/5.0(Windows NT 6.1; rv:11.0)Gecko/20100101」を参照してください。 Firefox/11.0 '}) if result.status_code == 200: リターンの結果。content' 返されたレスポンスは、質問 – stachern

+0

に記載されているようにhtml_in_cp1251です。dev_appserverと本番環境の両方のどこかでresult.content .__ class__を好んでログできますか? dev_appserverのstrだが、プロダクションのunicodeがあれば私は興味がある。あなたが記録したいかもしれないもう一つのことはrepr(result.content)でしょう - どちらの場合も同じでなければなりません。しかし、それは長すぎるかもしれません。おそらくrepr(result.content [:500])? –

+0

申し訳ありませんが、私はとても長い時間がかかりました。 'result.content .__ class__:' 'repr(result.content): '<!DOCTYPE html PUBLIC" - // W3C // DTD XHTML 1.0 Transitional // EN "" httpこれはローカル出力です(すべて正常です)。 ://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd "> \ r \ n \ r \ n = "text-html; charset = windows-1251" xc1 \ xc3 \ xdd \ xd3、\ xf2 \ xf2 \ xf3 \ xe4 \ xe3 \ xe3 \ xe4 \ xe3 \ xf3 \ \ xe5 \ xed \ xf2 \ xe \ xe \ xe \ xe \ xe \ xe8 \ xf7 \ xe5 \ xf1 \ xea \ xe8 \ xe9' – stachern

関連する問題