私はxmlファイルにこの文字があります:
<data>
<products>
<color>fumè</color>
</product>
</data>
ElementTreeのインスタンスを次のコードで生成してみます。
string_data = open('file.xml')
x = ElementTree.fromstring(unicode(string_data.encode('utf-8')))
そして私は次のエラーを受け取ります:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 185: ordinal not in range(128)
(注:位置は正確ではありません。大きなものからxmlをサンプリングしました)
それを解決するには?ありがとう
not ElementTreeを機能させるにはXMLをデコードする必要があります。 XMLは独自のエンコーディング情報(デフォルトはUTF-8)を保持し、ElementTreeはあなたのために働き、ユニコードを出力します:
_>>> data = '''\
... <data>
... <products>
... <color>fumè</color>
... </products>
... </data>
... '''
>>> x = ElementTree.fromstring(data)
>>> x[0][0].text
u'fum\xe8'
_
データがfile(like)オブジェクトに含まれている場合は、ファイル名またはファイルオブジェクトを直接ElementTree.parse()
関数に渡します。
_x = ElementTree.parse('file.xml')
_
Requests(HTTP for Humans) 、response.text
を使用しているときにこの問題に遭遇した可能性があります。response.content
を使用すると、デコードされていないデータを取得できるため、ElementTreeそれ自体をデコードできます。正しいエンコーディングを使用することを忘れないでください。
詳細: http://docs.python-requests.org/en/latest/user/quickstart/#response-content
Utf-8文字列をUnicodeオブジェクトにdecodeする必要があります。そう
string_data.encode('utf-8')
する必要があります
string_data.decode('utf-8')
string_data
は実際にはutf-8文字列です。
要約すると:ユニコードオブジェクトからutf-8文字列を取得するには、encodeユニコード(utf-8エンコーディングを使用)、および文字列をユニコードオブジェクトにdecodeそれぞれのエンコーディングを使用して文字列。
概念の詳細については、以下を読むことをお勧めします 絶対にすべてのソフトウェア開発者は絶対に、Unicodeと文字セットについて確実に知っておく必要があります (Python特定ではありません)。
ファイルを開くのではなく、parse
関数を使用してみましたか...(.read()
を機能させるには、BTWの後に.fromstring()
が必要です...)
import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()
# etc...
関数open()
はstring
を返しません。代わりにopen('file.xml').read()
を使用してください。
ほとんどの場合、ファイルはUTF-8ではありません。 è
文字は、他のエンコードlatin-1
例えば。