12

ライブラリxml.dom.minidomを使用して一連のxmlファイルを解析し、データを抽出してテキストファイルに入れようとしています。ほとんどのXMLはうまく機能しますが、一部のXMLでは、minidom.parsestring()を呼び出すと次のエラーが発生します。

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

これは、他の一部の非ASCII文字でも発生します。私の質問は:ここでの私の選択肢は何ですか?XMLファイルを解析する前に、英語以外の文字をすべて削除/置換する必要がありますか?

4

5 に答える 5

9

それをデコードしてみてください:

> print u'abcdé'.encode('utf-8')
> abcdé

> print u'abcdé'.encode('utf-8').decode('utf-8')
> abcdé
于 2011-03-16T18:04:18.167 に答える
5

文字列が'str'の場合:

xmldoc = minidom.parseString(u'{0}'.format(str).encode('utf-8'))

これは私のために働いた。

于 2016-07-13T05:12:55.190 に答える
3

Minidomは、Unicode文字列の解析を直接サポートしていません。これは、歴史的にサポートと標準化が不十分だったものです。多くのXMLツールは、バイトストリームのみをXMLパーサーが消費できるものとして認識します。

プレーンファイルがある場合は、それらをバイト文字列(Unicodeではありません!)として読み込んでに渡すか、ファイルを直接読み取るをparseString()使用する必要があります。parse()

于 2011-03-17T00:56:47.973 に答える
0

OPが文字列の解析について質問したことは知っていますが、Document.writexml(...)を介してDOMモデルをファイルに書き込むときに同じ例外が発生しました。その(関連する)問題を抱えている人々がここに上陸した場合、私は私の解決策を提供します。

UnicodeEncodeErrorをスローしていた私のコードは次のようになりました:

with tempfile.NamedTemporaryFile(delete=False) as fh:
    dom.writexml(fh, encoding="utf-8")

「encoding」パラメータはXMLヘッダーにのみ影響し、データの処理には影響しないことに注意してください。これを修正するために、次のように変更しました。

with tempfile.NamedTemporaryFile(delete=False) as fh:
    fh = codecs.lookup("utf-8")[3](fh)
    dom.writexml(fh, encoding="utf-8")

これにより、ファイルハンドルがencodings.utf_8.StreamWriterのインスタンスでラップされます。このインスタンスは、データをASCIIではなくUTF-8として処理し、UnicodeEncodeErrorがなくなりました。xml.dom.minidom.Node.toprettyxml(...)のソースを読んでアイデアを得ました。

于 2015-10-27T22:36:35.837 に答える
-2

私はこのエラーに数回遭遇します、そしてそれを扱う私のハッキーな方法はこれをすることです:

def getCleanString(word):   
   str = ""
   for character in word:
      try: 
         str_character = str(character)
         str = str + str_character
      except:
         dummy = 1 # this happens if character is unicode
   return str

もちろん、これはおそらくそれを行うためのばかげた方法ですが、それは私のために仕事を成し遂げ、私にスピードを犠牲にすることはありません。

于 2011-03-17T01:05:10.827 に答える