如何将HTML美化打印到文件并添加缩进
我正在使用 lxml.html 来生成一些 HTML 代码。我想把最终的结果美化一下(加上缩进),然后保存到一个 HTML 文件里。请问我该怎么做呢?
这是我到目前为止尝试过的内容:
import lxml.html as lh
from lxml.html import builder as E
sliderRoot=lh.Element("div", E.CLASS("scroll"), style="overflow-x: hidden; overflow-y: hidden;")
scrollContainer=lh.Element("div", E.CLASS("scrollContainer"), style="width: 4340px;")
sliderRoot.append(scrollContainer)
print lh.tostring(sliderRoot, pretty_print = True, method="html")
如你所见,我使用了 pretty_print=True
这个属性。我以为这样可以得到带缩进的代码,但实际上并没有什么帮助。以下是输出的结果:
<div style="overflow-x: hidden; overflow-y: hidden;" class="scroll"><div style="width: 4340px;" class="scrollContainer"></div></div>
11 个回答
28
如果你把HTML代码存储为一个没有格式的字符串,放在一个叫做 html_string
的变量里,可以使用beautifulsoup4来处理,方法如下:
from bs4 import BeautifulSoup
print(BeautifulSoup(html_string, 'html.parser').prettify())
51
虽然我的回答现在可能没什么帮助,但我还是把它放在这里,方便将来其他人参考。
lxml.html.tostring()
这个函数,实际上并不会按照你设置的pretty_print=True
来美化输出的HTML。
不过,它的“兄弟”模块lxml.etree
就能很好地做到这一点。
所以你可以这样使用它:
from lxml import etree, html
document_root = html.fromstring("<html><body><h1>hello world</h1></body></html>")
print(etree.tostring(document_root, encoding='unicode', pretty_print=True))
输出结果是这样的:
<html>
<body>
<h1>hello world</h1>
</body>
</html>
149
我最后直接使用了BeautifulSoup。这个工具是lxml.html.soupparser用来解析HTML的。
BeautifulSoup有一个叫做prettify的方法,顾名思义,它就是用来美化HTML的,能让代码看起来更整齐,缩进也处理得很好。
不过,BeautifulSoup不会修复HTML,所以如果代码本身有问题,它还是会保持那样。但在这种情况下,因为代码是由lxml生成的,HTML代码至少应该是语义上正确的。
在我问题中的例子里,我需要这样做:
from bs4 import BeautifulSoup as bs
root = lh.tostring(sliderRoot) #convert the generated HTML to a string
soup = bs(root) #make BeautifulSoup
prettyHTML = soup.prettify() #prettify the html