在Python中清理HTML
我正在从一些外部来源收集内容,发现其中有些内容的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在提取数据方面表现得特别出色。