0

次の入力 XML ファイルがあります。rel_notes タグを読み取って出力します...次のエラーが発生します

入力 XML:

<rel_notes>
    •   Please move to this build for all further test and development activities 
    •   Please use this as base build to verify compilation and sanity before any check-in happens

</rel_notes>

サンプルの Python コード:

file = open('data.xml,'r')
from xml.etree import cElementTree as etree
tree = etree.parse(file)
print('\n'.join(elem.text for elem in tree.iter('rel_notes')))

出力

   print('\n'.join(elem.text for elem in tree.iter('rel_notes')))
 File "C:\python2.7.3\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2022' in position 9: character maps to <undefined>
4

2 に答える 2

1

問題は、Unicode を Windows コンソールに出力することです。つまり、文字 '•'cp437はコンソールでは使用できません。

問題を再現するには、次を試してください。

print u'\u2022'

PYTHONIOENCODING環境変数を設定して、表現できないすべての文字を対応する xml char 参照に置き換えるように python に指示できます。

T:\> set PYTHONIOENCODING=cp437:xmlcharrefreplace
T:\> python your_script.py

または、印刷する前にテキストをバイトにエンコードします。

print u'\u2022'.encode('cp437', 'xmlcharrefreplace')

最初の質問への回答

<build_location/>各要素のテキストを印刷するには:

import sys
from xml.etree import cElementTree as etree

input_file = sys.stdin # filename or file object
tree = etree.parse(input_file)
print('\n'.join(elem.text for elem in tree.iter('build_location')))

入力ファイルが大きい場合。iterparse()使用できます

import sys
from xml.etree import cElementTree as etree

input_file = sys.stdin
context = iter(etree.iterparse(input_file, events=('start', 'end')))
_, root = next(context) # get root element
for event, elem in context:
    if event == 'end' and elem.tag == 'build_location':
       print(elem.text)
       root.clear() # free memory
于 2012-11-04T04:28:38.447 に答える
0

上記のスニペット全体が完全に役立つとは思いません。しかし、UnicodeEncodeError は通常、ASCII 文字が適切に処理されない場合に発生します。

例:

unicode_str = html.decode(<source encoding>)

encoded_str = unicode_str.encode("utf8")

この回答ですでに明確に説明されています: Python: Convert Unicode to ASCII without errors

これにより、少なくとも UnicodeEncodeError が解決されるはずです。

于 2012-11-04T06:18:56.507 に答える