最も簡単な解決策は、おそらくlxmlを使用することです。ここでは、要素間の空白を無視するようにパーサー オプションを設定できます。
>>> from lxml import etree
>>> parser = etree.XMLParser(remove_blank_text=True)
>>> xml_str = '''<root>
>>> <head></head>
>>> <content></content>
>>> </root>'''
>>> elem = etree.XML(xml_str, parser=parser)
>>> print etree.tostring(elem)
<root><head/><content/></root>
これはおそらくあなたのニーズには十分ですが、安全のためにいくつかの警告があります:
これは、要素間の空白ノードを削除するだけで、コンテンツが混在する要素内の空白ノードを削除しないようにします。
>>> elem = etree.XML('<p> spam <a>ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p> spam <a>ham</a> <a>eggs</a></p>
テキストノードの先頭または末尾の空白は削除されません。ただし、状況によっては、混合コンテンツから空白ノードを削除することもあります: パーサーがそのレベルで空白以外のノードにまだ遭遇していない場合。
>>> elem = etree.XML('<p><a> ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p><a> ham</a><a>eggs</a></p>
それを望まない場合はxml:space="preserve"
、尊重される を使用できます。別のオプションは、dtd と use を使用することetree.XMLParser(load_dtd=True)
です。この場合、パーサーは dtd を使用して、どの空白ノードが重要かどうかを判断します。
それ以外では、不要な空白を削除する独自のコードを作成する必要があります (子孫を反復し、必要に応じて、空白または空の文字列のみを含むセット.text
と.tail
プロパティを繰り返します)。None