我终于升级(重写;))我的第一个Django应用程序,但我正在迁移所有内容。
我愚蠢地为用户提供了完整的 WYSIWYG 编辑器来处理某些任务,所产生的HTML代码当然非常难看,附加的标签比内容更多。
是否有人知道我可以用来清理代码的库或外部shell应用程序?
我有时会使用整洁,但据我所知,这并不是我所要求的。我想简化所有额外的跨度和其他垃圾标签。我用一些正则表达式清理了最令人反感的冒犯风格,但是我需要花很长时间才能使用正则表达式做更多的事情。
有什么想法吗?
答案 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
。
“额外范围”和“垃圾标记”是您需要非常仔细地定义的内容,以便您可以在不删除内容的情况下删除标记。
我建议你做两件事。
修复您的应用,以便用户在任何情况下都不提供HTML。 Django可以使用更加用户友好的RST标记。 http://docs.djangoproject.com/en/1.3/ref/templates/builtins/#django-contrib-markup
编写一个美丽的Soup解析器,并将用户的内容转换为RST标记。保留结构元素(标题,列表等)并尽可能地丢失格式。