2

たとえば、タグ名にUnicodeを使用するドキュメントがあるとします<año>2012</año>

lxmlのetreeを使用してそのようなドキュメントを解析すると、問題はなく、ツリーは正しく構築されます。しかし、(デバッグ目的で)いくつかの要素を出力しようとすると、ASCIIとしていくつかのUnicode文字をエンコードしようとして失敗したという例外が発生します。

.tag同じユニコード文字を含むノード()の名前を問題なく出力できるため、端末構成やファイルのエンコード不良の問題ではありません。どうやらこの問題は、Elementオブジェクトの「文字列化」が原因であるようです。これは、タグ名が単純なASCIIから離れていることを前提としています。

次のコードは問題を示しています(また、ファイル/端末/エンコーディングの問題ではないことも示しています)。

# coding: utf-8
from lxml import etree
doc = """<?xml version="1.0" encoding="utf-8"?>
<año>2012</año>
"""
x = etree.fromstring(doc)   # No problem
print x.tag                 # No problem
print x                     # Exception

LC_CTYPEが適切に定義された端末で上記のスクリプトを実行すると、次の出力が生成されます。

año
Traceback (most recent call last):
  File "procesar.py", line 8, in <module>
    print x
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 10: ordinal not in range(128)

print x.tagどのように正しく出力されるかに注意してくださいañoprint xのようなものを生成するべきではありません<Element año at b7d26eb4>か?

これは既知の問題ですか?回避策について何かアイデアはありますか?

4

1 に答える 1

4

出力前にユニコード文字列をバイト文字列に変換する必要があります

試す:

print unicode(x).encode('utf8')

ユニコード関数を引用:

__unicode__() メソッドを提供するオブジェクトの場合、引数なしでこのメソッドを呼び出して Unicode 文字列を作成します。他のすべてのオブジェクトについては、8 ビットの文字列バージョンまたは表現が要求され、「strict」モードのデフォルト エンコーディングのコーデックを使用して Unicode 文字列に変換されます。
于 2012-04-10T16:03:30.467 に答える