在Python中清理HTML

19 投票
5 回答
23421 浏览
提问于 2025-04-16 00:10

我正在从一些外部来源收集内容,发现其中有些内容的HTML/DOM有错误。比如,有些HTML缺少结束标签,或者标签属性格式不正确。请问有没有办法在Python中原生处理这些错误,或者有没有什么第三方模块可以安装来解决这个问题?

5 个回答

4

有一些Python的工具可以用来操作HTML Tidy库项目,但是自动清理坏掉的HTML代码其实挺难的。这就像是试图自动修复源代码一样,可能性太多了。你还是需要检查处理后的结果,几乎肯定还得手动再修正一些地方。

11

这是一个使用 lxml.html.clean.Cleaner 模块来清理HTML的例子。

需要安装 lxml 模块 — 可以通过 pip install lxml 来安装(这个模块是用C语言写的,所以可能比纯Python的解决方案要快)。

import sys

from lxml.html.clean import Cleaner


def sanitize(dirty_html):
    cleaner = Cleaner(page_structure=True,
                  meta=True,
                  embedded=True,
                  links=True,
                  style=True,
                  processing_instructions=True,
                  inline_style=True,
                  scripts=True,
                  javascript=True,
                  comments=True,
                  frames=True,
                  forms=True,
                  annoying_tags=True,
                  remove_unknown_tags=True,
                  safe_attrs_only=True,
                  safe_attrs=frozenset(['src','color', 'href', 'title', 'class', 'name', 'id']),
                  remove_tags=('span', 'font', 'div')
                  )

    return cleaner.clean_html(dirty_html)


if __name__ == '__main__':

    with open(sys.argv[1]) as fin:

        print(sanitize(fin.read()))

想了解更多选项,可以查看 文档,里面有你可以传给Cleaner的所有选项的完整列表。

20

我建议你使用BeautifulSoup。它有一个很棒的解析器,可以很好地处理那些格式不太正确的标签。一旦你把整个文档读入了,就可以直接输出结果。

from bs4 import BeautifulSoup
tree = BeautifulSoup(bad_html)
good_html = tree.prettify()

我用过很多次,效果非常好。如果你只是想从糟糕的HTML中提取数据,BeautifulSoup在提取数据方面表现得特别出色。

撰写回答