私は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の何かがありますか?
CP1251ではなくUTF-8としてページを取得しているようです。ユーザーエージェントを盗聴している可能性がありますが、使用しているエンコーディングを決定するサイトは見たことがありません。 –
代わりに.decode( 'utf-8')を使用すると、次のようになります。UnicodeDecodeError: 'utf8'コーデックは286の位置で0xc1バイトをデコードできません:無効な開始バイト – stachern
エラーを返す文字列を's.encode( 'latin1')。decode( 'utf-8')'、正しい文字列を取得します。だから何かがエンコーディングを間違って取得している - それはlxmlすることができます。 –