<p>最简单的解决方案可能是使用<a href="http://codespeak.net/lxml/" rel="noreferrer">lxml</a>,在这里您可以设置一个解析器选项来忽略元素之间的空白:</p>
<pre><code>>>> 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>
</code></pre>
<p>这可能足以满足您的需要,但有些警告是安全的:</p>
<p>这将只删除元素之间的空白节点,并尝试不删除包含混合内容的元素内部的空白节点:</p>
<pre><code>>>> 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>
</code></pre>
<p>不会删除textnodes中的前导或尾随空白。但是,在某些情况下,它仍然会从混合内容中删除空白节点:如果解析器在该级别还没有遇到非空白节点。</p>
<pre><code>>>> 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>
</code></pre>
<p>如果你不想要,你可以使用<code>xml:space="preserve"</code>,这将得到尊重。另一个选择是使用dtd并使用<code>etree.XMLParser(load_dtd=True)</code>,在这里解析器将使用dtd来确定哪些空白节点是有效的还是无效的。</p>
<p>除此之外,您还必须编写自己的代码来删除不需要的空白(迭代子代,并在适当的情况下,将只包含空白的<code>.text</code>和<code>.tail</code>属性设置为<code>None</code>或空字符串)</p>