2

オンラインソースからXMLファイルを解析していますが、utf-8文字の読み取りに問題があります。今、私は同様の問題を扱う他のいくつかの質問を読み通しましたが、これまでのところどの解決策も機能しません。現在、コードは次のようになっています。

class XMLParser(webapp2.RequestHandler):

def get(self):

        url = fetch('some.xml.online')

        xml = parseString(url.content)

        vouchers = xml.getElementsByTagName("VoucherCode")

        for voucher in vouchers:

          if voucher.getElementsByTagName("ActivePartnership")[0].firstChild.data == "true":

            coupon = Coupon()
            coupon.description = str(voucher.getElementsByTagName("Description")[0].firstChild.data.decode('utf-8'))
            coupon.prov_key = str(voucher.getElementsByTagName("Id")[0].firstChild.data)
            coupon.put()
            self.redirect('/admin/coupon')

これから発生するエラーを以下に示します。これは、説明フィールドの「ü」が原因で発生します。これは、後でデータを使用するときにも表示する必要があります。

ファイル"C:\ Users \ Vincent \ Documents \ www \ Sparkompass \ Website \ main.py"、行217、getcoupon.description = str(voucher.getElementsByTagName( "Description")[0] .firstChild.data.decode ('utf-8'))ファイル "C:\ Python27 \ lib \ encodings \ utf_8.py"、16行目、デコードリターンcodecs.utf_8_decode(input、errors、True)UnicodeEncodeError:'ascii'コーデックはエンコードできません16番目の文字u'\xfc':順序が範囲内にありません(128)

説明を削除すると、すべてが正常に機能します。データベースモデルの定義では、説明を次のように定義しました。

description = db.StringProperty(multiline=True)

試行2

私もこのようにしようとしました:

coupon.description = str(voucher.getElementsByTagName("Description")[0].firstChild.data).decode('utf-8')

それも私に与えました:

UnicodeEncodeError:'ascii'コーデックは16桁目の文字u'\ xfc'をエンコードできません:序数が範囲内にありません(128)

どんな助けでも大歓迎です!

アップデート

XMLファイルにはドイツ語が含まれています。つまり、そこに含まれる文字の多くはUTF-8文字です。したがって、理想的には、より高いレベルでデコードを行う方が良いかもしれないと今考えています。

xml = parseString(url.content)

しかし、これまでのところ、私もそれを機能させることができませんでした。これは、GAEがデータベースモデルに文字列として登録するために必要なものであるため、目的はASCIIの文字を取得することです。

4

2 に答える 2

1
>>> u"ü".decode("utf-8")

UnicodeEncodeError

>>> u"ü".encode("utf-8") 

'\ xc3 \ xbc'

>>> u"ü".encode("utf-8").decode("utf-8")

u'\ xfc'

>>> str(u"ü".encode("utf-8").decode("utf-8"))

UnicodeEncodeError

>>> str(u"ü".encode("utf-8"))

'\ xc3 \ xbc'

どのエンコーディングが必要ですか?

次のものも使用できます。

string2 = cgi.escape(string).encode("latin-1", "xmlcharrefreplace") 

これにより、latin-1以外のすべての文字がxmlエンティティに置き換えられます。

于 2013-01-05T20:47:25.420 に答える
0

説明をTextPropertyに変更することで、今のところ問題を解決しましたが、エラーは発生しませんでした。たとえば、これを行うときに並べ替えやフィルタリングができないことは承知していますが、説明としては問題ありません。

背景情報:https ://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses#TextProperty

于 2013-01-06T09:37:39.813 に答える