web-dev-qa-db-ja.com

ElementTreeとUnicode

私は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をサンプリングしました)

それを解決するには?ありがとう

20
pistacchio

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')
_
10
Martijn Pieters

Requests(HTTP for Humans)response.textを使用しているときにこの問題に遭遇した可能性があります。response.contentを使用すると、デコードされていないデータを取得できるため、ElementTreeそれ自体をデコードできます。正しいエンコーディングを使用することを忘れないでください。

詳細: http://docs.python-requests.org/en/latest/user/quickstart/#response-content

32
gitaarik

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特定ではありません)。

14
Lukas Graf

ファイルを開くのではなく、parse関数を使用してみましたか...(.read()を機能させるには、BTWの後に.fromstring()が必要です...)

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()
# etc...
3
Jon Clements

関数open()stringを返しません。代わりにopen('file.xml').read()を使用してください。

1
hejhula

ほとんどの場合、ファイルはUTF-8ではありません。 è文字は、他のエンコードlatin-1 例えば。

0
Maksym Polshcha