用Python编写的HTML缩进器

14 投票
5 回答
7941 浏览
提问于 2025-04-16 20:17

我在找一个免费的(自由使用的)HTML格式化工具(或者说重新格式化工具),最好是用Python写的(可以是模块或者命令行工具)。我不需要用白名单来过滤HTML,只想把HTML代码整理一下,让它更容易阅读。例如,我有以下这段代码:

<ul><li>Item</li><li>Item
</li></ul>

输出结果可能会是这样的:

<ul>
    <li>Item</li>
    <li>Item</li>
</ul>

注意:我不想要一个非Python软件的接口(比如用C写的Tidy),我需要的是一个完全用Python写的脚本。

非常感谢。

5 个回答

7

使用BeautifulSoup

使用BeautifulSoup模块和它的美化功能有很多种方法。下面是一些例子,帮助你入门。

通过命令行

$ python -m BeautifulSoup < somefile.html > prettyfile.html

在VIM中(手动操作)

如果你不想把文件写回磁盘,其实可以不这样做,不过我还是加上了这一步,这样效果和命令行的例子是一样的。

$ vi somefile.html
:!python -m BeautifulSoup < %
:w prettyfile.html

在VIM中(定义快捷键)

在你的~/.vimrc文件中定义:

nmap =h !python -m BeautifulSoup < %<CR>

然后,当你在vim中打开一个需要美化的文件时

$vi somefile.html
=h
:w prettyfile.html

再次强调,保存美化后的内容是可选的。

Python Shell

$ python
>>> from BeautifulSoup import BeautifulSoup as parse_html_string
>>> from os import path
>>> uglyfile = path.abspath('somefile.html')
>>> path.isfile(uglyfile)
True
>>> prettyfile = path.abspath(path.join('.', 'prettyfile.html'))
>>> path.exists(prettyfile)
>>> doc = None
>>> with open(uglyfile, 'r') as infile, open(prettyfile, 'w') as outfile:
...     # Assuming very simple case
...     htmldocstr = infile.read()
...     doc = parse_html_string(htmldocstr)
...     outfile.write(doc.prettify())

# That's it; you can manually manipulate the dom too though
>>> scripts = doc.findAll('script')
>>> meta = doc.findAll('meta')
>>> print doc.prettify()
[imagine beautiful html here]

>>> import jsbeautifier
>>> print jsbeautifier.beautify(script.string)
[imagine beautiful script here]
>>> 
8

你可以使用内置模块 xml.dom.minidomtoprettyxml 函数来实现这个功能:

>>> from xml.dom import minidom
>>> x = minidom.parseString("<ul><li>Item</li><li>Item\n</li></ul>")
>>> print x.toprettyxml()
<?xml version="1.0" ?>
<ul>
    <li>
        Item
    </li>
    <li>
        Item
    </li>
</ul>
3

BeautifulSoup有一个叫做prettify的功能,可以做到这一点。查看这个问题

撰写回答