我选择j.f.sebastian的答案是因为我认为它是最简单的,因此也是最好的,但是我正在为那些不想安装漂亮汤的人添加另一个解决方案。(而且,漂亮的汤树建造者
deprecated in html5lib 1.0
)这个解决方案多亏了Amarghosh的提示;我只是稍微充实了一下。看着html5lib,我意识到它将以本机方式输出一个minidom对象,这意味着我可以使用他的建议
toprettyxml()
. 我想到的是:
from html5lib import HTMLParser, treebuilders
from cStringIO import StringIO
def tidy_html(text):
"""Returns a well-formatted version of input HTML."""
p = HTMLParser(tree=treebuilders.getTreeBuilder("dom"))
dom_tree = p.parseFragment(text)
# using cStringIO for fast string concatenation
pretty_HTML = StringIO()
node = dom_tree.firstChild
while node:
node_contents = node.toprettyxml(indent=' ')
pretty_HTML.write(node_contents)
node = node.nextSibling
output = pretty_HTML.getvalue()
pretty_HTML.close()
return output
还有一个例子:
>>> text = """bold, italic
>>> tidy_html(text)
bold, italic
a div
为什么我要在树的子节点上迭代,而不是仅仅调用
toprettyxml()
在
dom_tree
直接?我处理的一些HTML实际上是HTML片段,所以它缺少
和
标签。为了处理这个我用了
parseFragment()
方法,这意味着我得到一个documentfragment作为回报(而不是一个文档)。不幸的是,它没有
writexml()
方法(其中
toprettyxml()
调用),所以我迭代子节点,这些子节点确实有这个方法。