在Python中清理HTML

时间:2010-06-19 00:44:29

标签: python html django

我正在汇总来自少数外部资源的内容,并发现其中一些内容包含HTML / DOM中的错误。一个很好的例子是HTML缺少结束标记或格式错误的标记属性。有没有办法清除本机中的错误或我可以安装的任何第三方模块?

5 个答案:

答案 0 :(得分:16)

我建议Beautifulsoup。它有一个很棒的解析器,可以非常优雅地处理格式错误的标签。一旦你读完了整个树,就可以输出结果。

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

我已经多次使用它并且它可以创造奇迹。如果您只是从bad-html中提取数据,那么BeautifulSoup在提取数据方面真的很棒。

答案 1 :(得分:6)

以下是使用lxml.html.clean.Cleaner模块清理HTML的示例:

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()))

查看docs以获取可传递给Cleaner的完整选项列表。

答案 2 :(得分:3)

HTML Tidy Library Project有python绑定,但自动清理损坏的HTML是一个难以破解的难题。它与尝试自动修复源代码没有太大区别 - 可能性太多了。您仍然需要检查输出,并且几乎肯定会手动进行进一步的修复。

答案 3 :(得分:3)

我正在使用lxml将HTML转换为正确的(格式良好的)XML:

from lxml import etree
tree   = etree.HTML(input_text.replace('\r', ''))
output_text = '\n'.join([ etree.tostring(stree, pretty_print=True, method="xml") 
                          for stree in tree ])

......在中间做了大量的'危险元素'....

答案 4 :(得分:1)

这可以使用tidylib模块中的tidy_document函数来完成。

import tidylib
html = '<html>...</html>'
inputEncoding = 'utf8'
options = {
    str("output-xhtml"): True, #"output-xml" : True
    str("quiet"): True,
    str("show-errors"): 0,
    str("force-output"): True,
    str("numeric-entities"): True,
    str("show-warnings"): False,
    str("input-encoding"): inputEncoding,
    str("output-encoding"): "utf8",
    str("indent"): False,
    str("tidy-mark"): False,
    str("wrap"): 0
    };
document, errors = tidylib.tidy_document(html, options=options)