如何清理丑陋的 WYSIWYG HTML 代码?Python 或 *nix 工具
我终于要升级(重写 ;))我的第一个Django应用程序了,但我正在迁移所有内容。
我之前给用户提供了一个完整的所见即所得编辑器来完成某些任务,结果生成的HTML代码非常糟糕,里面的多余标签比实际内容还多。
有没有人知道可以用来清理这些代码的库或者外部工具吗?
我有时会用tidy,但据我所知,它并不能满足我的需求。我想要简化那些多余的span标签和其他乱七八糟的标签。我用一些正则表达式清理了一些最糟糕的样式,但仅靠正则表达式做更多的清理会花费很长时间。
有什么好主意吗?
3 个回答
0
标准的解决方案是 Beautiful Soup
。
所谓的“额外的span”和“垃圾标签”,你需要非常仔细地定义,这样才能在去掉这些标签的时候不影响内容。
我建议你做两件事。
修正你的应用,让用户在任何情况下都不能提供HTML代码。Django可以使用RST标记,这样对用户来说更友好。http://docs.djangoproject.com/en/1.3/ref/templates/builtins/#django-contrib-markup
写一个Beautiful Soup解析器,把用户的内容转换成RST标记。保留结构元素(比如标题、列表等),尽量去掉格式化。
2
Beautiful Soup 可能会给你一个更全面的解决方案,但如果你愿意按照 HTML5 的规则来处理,使用 html5lib 可能会让你更简单地清理代码:
import html5lib
from html5lib import sanitizer, treebuilders, treewalkers, serializer
my_html = "<i>Some html fragment</I>" #intentional 'I'
html_parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom"))
dom_tree = html_parser.parseFragment(my_html)
walker = treewalkers.getTreeWalker("dom")
stream = walker(dom_tree)
s = serializer.htmlserializer.HTMLSerializer(omit_optional_tags=False, quote_attr_values=True)
cleaned_html = s.render(stream)
cleaned_html == '<i>Some html fragment</i>"
你还可以通过这样初始化你的 html_parser 来清理 HTML:
html_parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom"), tokenizer=sanitizer.HTMLSanitizer)
3
你可以看看Bleach,这是一个基于白名单的HTML清理工具。它使用html5lib来完成Kyle提到的功能,但你可以更好地控制最终输出中允许哪些元素和属性。