清理丑陋的WYSIWYG HTML代码? Python或* nix实用程序

时间:2011-05-17 08:37:33

标签: python html regex django wysiwyg

我终于升级(重写;))我的第一个Django应用程序,但我正在迁移所有内容。

我愚蠢地为用户提供了完整的 WYSIWYG 编辑器来处理某些任务,所产生的HTML代码当然非常难看,附加的标签比内容更多。

是否有人知道我可以用来清理代码的库或外部shell应用程序?

我有时会使用整洁,但据我所知,这并不是我所要求的。我想简化所有额外的跨度和其他垃圾标签。我用一些正则表达式清理了最令人反感的冒犯风格,但是我需要花很长时间才能使用正则表达式做更多的事情。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您还可以查看Bleach基于白名单的HTML清理程序。它使用html5lib来执行Kyle发布的操作,但是您可以更好地控制最终输出中允许哪些元素和属性。

答案 1 :(得分:2)

Beautiful Soup可能会为您提供更完整的解决方案,但您可以使用html5lib更简单地完成一些清理工作(如果您对html5规则没有问题):

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)

答案 2 :(得分:0)

标准答案为Beautiful Soup

“额外范围”和“垃圾标记”是您需要非常仔细地定义的内容,以便您可以在不删除内容的情况下删除标记。

我建议你做两件事。

  1. 修复您的应用,以便用户在任何情况下都不提供HTML。 Django可以使用更加用户友好的RST标记。 http://docs.djangoproject.com/en/1.3/ref/templates/builtins/#django-contrib-markup

  2. 编写一个美丽的Soup解析器,并将用户的内容转换为RST标记。保留结构元素(标题,列表等)并尽可能地丢失格式。