【发布时间】:2011-09-22 02:22:29
【问题描述】:
这个小程序:
from lxml.html import tostring, fromstring
e = fromstring('''
<html><head>
<link href="/comments.css" rel="stylesheet" type="text/css">
<link href="/index.css" rel="stylesheet" type="text/css">
</head>
<body>
<span></span>
<span></span>
</body>
</html>''')
print (tostring(e, encoding=str)) #unicode on python 2
将打印:
<html><head><link href="/comments.css" rel="stylesheet" type="text/css"><link
href="/index.css" rel="stylesheet" type="text/css"></head><body>
<span></span>
<span></span>
</body></html>
删除了头部的空格和换行符。 即使我们将两个 元素放在
中也会发生这种情况。 似乎删除了 head 元素之间的空白文本节点 (\s*)。如何在 之间保留空格和换行符? (我希望输出与输入完全相同)
【问题讨论】:
-
lxml 用于解析和创建 XML 和 HTML。保证输出的内容具有正确的语法并且可以使用其他工具等进行解析。不能保证它会保留格式,因为这不是 lxml 的目的。如果您想在保留 HTML 格式的同时修改 HTML(为什么要这样做?),那么 lxml 是错误的工具。
-
尽管您可以使用不同的解析器或标记器。但这不值得付出努力。解释为什么你需要保留空白。通常你不会。
-
输入由用户给出,我使用 lxml 来检查和清理语法。如果输入没有错误,我想给用户同样的输入。
-
那么如果没有错误,返回原件? :-) 您可能想研究 htmltidy 或其他已经执行此操作的工具。我相信 BeautifulSoup 会保留空白,但 Python 3 的支持还不是很好。
-
BeautifulSoup(3.1.0.1,与 python 3 兼容的最新版本)不保留空格!
标签: python python-3.x html-parsing lxml