これをマルチバイトであってもstring型で取得できる様に動きを変える事は出来ないでしょうか?
なさそうです。
ElementTreeが内部で使っているexpatは、文字列を正しく処理するために、与えられたXMLデータをデコードしてUnicode文字列にします。この挙動を変更する方法はみあたりませんでした。具体的にはElementTreeの実装で xml.parsers.expat.ParserCreate(encoding=None, namespace_separator=None) を使ってXMLをパースしています。
現状は後続処理で「unicode型の場合は"encode("cp932")する"」みたいな変換ロジックを入れざるを得ない状況です。
エンコードされた文字列にしたい場合、この変換は無くせなそうです。ただし、「unicodeの場合は」という条件はなくても良いです。ASCII文字列が格納されたstr型の場合、 'hello'.encode('cp932')
としてもエラーにはならず、 'hello'
に変換されます(つまり変わりません)。
なお、Python3ではUnicode文字列とstr文字列は統合され、Python2でいうUnicode文字列のみになりました(型はstrです)。このため、ファイルに書き出す場合は常にutf-8やcp932等のエンコーディング変換が必要です。しかし、そのための変換処理は open
関数の encoding=
引数に指定すれば、ただ書き出すだけで済むため書き出し処理では意識せずに済みます。
Python2であれば以下のように書くことでPython3と同様の結果が得られます。
Python
1import xml.etree.ElementTree as ET
2import io
3
4root = ET.fromstring(xml)
5text = root.findtext(".//Hoge")
6
7with io.open('output.txt', 'wt', encoding='cp932') as f:
8 f.write(u'実行結果\n')
9 f.write(u'=================ここから\n')
10 f.write(text)
11 f.write('\n'
12 f.write(u'=================ここまで\n')
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/08 08:55