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