0

私は完全にgaeと混同しました。応答として(Google App Engine APIからのurlfetchを使用して)POSTリクエストを実行するスクリプトがあり、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'

非ユニコード文字はどうですか?そして、なぜすべてがローカルで大丈夫なのですか?私は自分のコードに配置するdecoding\encodingのすべてのバリエーションを試しました-何も役に立ちませんでした。私は今数日間立ち往生しています。

UPD:また、GAEのスクリプトに追加すると:

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

両方を「unicode」として返します。だから、私はhtmlが正しくデコードされたと信じています。それはGAEのlxmlで何かでしょうか?

4

2 に答える 2

1

エラーメッセージで取得した文字列には、そのタイプのユニコードが含まれていますが、内容は実際には、火曜日のUTF-8エンコーディングとなるバイトです。表示しているコードには何も問題がないため、urlfetch呼び出しを実行するコードを表示すると便利です。

于 2012-03-21T17:16:29.717 に答える
0

.encode('latin1')。decode('utf-8'、'ignore')を追加する回避策でうまくいきました。なぜそうなるのか説明できたらいいのにと思います。

于 2012-03-29T09:22:44.193 に答える