【问题标题】:Clean Up HTML in Python在 Python 中清理 HTML
【发布时间】:2011-03-05 16:06:41
【问题描述】:

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

【问题讨论】:

  • 这些答案是您想要的吗?如果您需要更多信息,我们当然可以提供帮助?
  • @JudoWill:是的,我能够设置 BeautifulSoup 和 Tidy。不幸的是,他们没有发现我遇到的很多问题。我最终构建了自己的函数来循环遍历 DOM 并解决问题。感谢您的帮助!
  • 您能否发布自己的功能作为答案。这是我经常遇到的一个问题,我一直在寻找新的解决方案。 :)

标签: python html django


【解决方案1】:

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

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

我已经用过很多次了,效果很好。如果你只是简单地从 bad-html 中提取数据,那么 BeautifulSoup 在提取数据方面真的很出色。

【讨论】:

  • 注意性能,BeautifulSoup 非常广泛。
  • @狼蛛。我同意,BeautifulSoup 很慢,但它是我见过的唯一可以解析一些疯狂的畸形 HTML 表格的东西。
【解决方案2】:

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

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

【讨论】:

  • 如何清除带有特定“id”或“类”的代码标签(div)? (完全包括文本)。
  • @triwo: ootb 不支持这个,但是你可以使用 lxml 解析标记并按类或 id 删除节点;例如见stackoverflow.com/questions/8226490
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    ...并在中间大量删除“危险元素”....

    【讨论】:

      【解决方案5】:

      这可以使用 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)
      

      【讨论】:

        猜你喜欢
        • 2014-12-17
        • 2013-06-11
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 2011-01-02
        • 1970-01-01
        相关资源
        最近更新 更多