21

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

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

4

6 に答える 6

35

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

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

于 2013-12-29T13:00:20.067 に答える
15

utf-8 文字列を Unicode オブジェクトにデコードする必要があります。そう

string_data.encode('utf-8')

する必要があります

string_data.decode('utf-8')

string_data実際にはutf-8文字列であると仮定します。

要約すると、Unicode オブジェクトから utf-8 文字列を取得するには、(utf-8 エンコーディングを使用して) Unicodeをエンコードし、文字列を Unicode オブジェクトに変換するには、それぞれのエンコーディングを使用して文字列をデコードします。

概念の詳細については、「すべてのソフトウェア開発者が絶対に、積極的に Unicode と文字セット(Python 固有ではない) について知る必要がある絶対的な最小値」を読むことをお勧めします。

于 2012-09-10T10:30:52.070 に答える
12

ElementTree が機能するために XML をデコードする必要はありません。XML は独自のエンコーディング情報 (デフォルトは UTF-8) を保持し、ElementTree が作業を行い、Unicode を出力します。

>>> 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')
于 2012-09-10T10:35:18.630 に答える
2

parseファイルを開く代わりに、関数を使用してみまし.read().fromstring()か...

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()
# etc...
于 2012-09-10T10:34:52.160 に答える
1

ほとんどの場合、ファイルは UTF-8 ではありません。文字は、たとえばè、他のエンコーディングから取得できます。latin-1

于 2012-09-10T10:28:56.943 に答える