最近投稿した質問のフォローアップの質問として...
私は ElementTree で XML 解析を行っています。Python には次のメソッドがあります。
def extract_all_text(element):
"".join(element.itertext())
これの目的は、要素からテキストを抽出し、要素内のテキストをラップしているタグを削除することです。ėg.,extract_all_text(ElementTree.fromstring('<a>B <c>D</c></a>'))
を返す必要がありB D
ます。ただし、改行を含むファイルの要素でこのメソッドを使用しようとすると、奇妙なエラーが発生します。エラーは次のようになります。
File "/home/Intredasting/foo.py", line 74, in bar
description = extract_all_text(root.find('description')).strip()
File "/home/Intredasting/foo.py", line 62, in extract_all_text
return "".join(element.itertext())
TypeError: sequence item 0: expected str instance, list found
ElementTree.dump(root.find('description'))
解析しようとしている XML 要素を表示するを実行すると、次のようになります。
<description>
Foo <a href="http://example.com">bar</a>.
</description>
要素が次のようになるようにファイルを編集して改行を削除すると:
<description>Foo <a href="http://example.com">bar</a>.</description>
その後、メソッドは完全に機能し、取得しFoo bar.
ます。なぜこれが起こるのですか?メソッドを改行で動作させるにはどうすればよいですか?
編集:
ここで使用している特定のファイルを確認できます (単純なバージョンに絞り込みましたが、それでもエラーが発生します): http://www.filedropper.com/example_1
このファイルをテストするには、試してください
$ python3
>>> import xml.etree.ElementTree as ET
>>> tree = ET.parse('/path/to/example.xml')
>>> desc = tree.getroot().find('description')
>>> print("".join(desc.itertext()))
(これにより、エラーが発生するはずです。)
別の編集:
このコードは、何が起こっているかについての追加の洞察を提供します (上記のコードに加えてこれを実行します)。
>>> for text in desc.itertext(): print(text)
['\n', ' Foo ']
bar
['.', '\n', ' ']
もちろん、これらのリストを結合して文字列にするだけで、この問題を回避できます。しかし、これは ElementTree のバグか、入力ファイルに問題があるか、私のバージョンの Python が台無しになっているように感じます。