如何将HTML美化打印到文件并添加缩进

110 投票
11 回答
149239 浏览
提问于 2025-04-16 18:27

我正在使用 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

撰写回答