清理Python中的HTML

清理Python中的HTML,python,html,django,Python,Html,Django,我正在聚合一些外部来源的内容,发现其中一些内容的HTML/DOM中存在错误。一个很好的例子是HTML缺少结束标记或格式错误的标记属性。有没有办法清除Python本机或我可以安装的任何第三方模块中的错误 有用于的python绑定,但自动清理损坏的HTML是一个难题。这与尝试自动修复源代码并没有太大区别——有太多的可能性了。您仍然需要查看输出,并且几乎肯定需要手动进行进一步的修复。我建议。它有一个很棒的解析器,可以非常优雅地处理格式错误的标记。阅读完整个树后,就可以输出结果了 from bs4 im

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

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

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

from bs4 import BeautifulSoup
tree = BeautifulSoup(bad_html)
good_html = tree.prettify()
我已经用过很多次了,效果非常好。如果您只是简单地从糟糕的html中提取数据,那么BeautifulSoup在提取数据时确实非常出色。

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


。。。在中间去除大量的“危险元素”…

< P>这可以用TiIDLIB模块中的TiyDyx文档函数来完成。
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)
导入tidylib
html=“…”
输入编码='utf8'
选项={
str(“输出xhtml”):True,#“输出xml”:True
str(“安静”):对,
str(“显示错误”):0,
str(“力输出”):真,
str(“数字实体”):True,
str(“显示警告”):False,
str(“输入编码”):输入编码,
str(“输出编码”):“utf8”,
str(“缩进”):False,
str(“整齐标记”):假,
str(“wrap”):0
};
文档,errors=tidylib.tidy_文档(html,options=options)

以下是使用模块清理HTML的示例:

导入系统 从lxml.html.clean导入清理器 def消毒(脏的html): 清洁剂=清洁剂(页面结构=真, meta=True, 嵌入=真, links=True, 风格=正确, 处理指令=真, inline_style=True, 脚本=真, javascript=True, 注释=正确, 帧=真, 形式=真, 恼人的标签=真, 删除\u未知\u标记=真, 仅安全属性=真, safe_attrs=frozenset(['src','color','href','title','class','name','id']), 删除_标记=('span','font','div') ) 返回cleaner.clean_html(dirty_html) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 以open(sys.argv[1])作为fin: 打印(消毒(fin.read())
查看可传递给清洁工的选项的完整列表。

请注意性能,BeautifulSoup非常扩展。@Tarantula。我同意,BeautifulSoup相当慢,但它是我见过的唯一能够解析那些基于HTML格式的表格的东西。这些答案中有你想要的吗?如果你需要更多的信息,我们当然可以帮助你?@JudoWill:是的,我可以把漂亮的衣服和整洁的衣服摆好。不幸的是,他们没有抓住我遇到的很多问题。我最终构建了自己的函数来遍历DOM并修复问题。谢谢你的帮助!你能发表你自己的函数作为答案吗。这是一个我有很多时间的问题,我一直在寻找新的解决方案
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)