清理丑陋的所见即所得HTML代码?Python或*nix实用程序

清理丑陋的所见即所得HTML代码?Python或*nix实用程序,python,html,regex,django,wysiwyg,Python,Html,Regex,Django,Wysiwyg,我终于升级(重写;))了我的第一个Django应用程序,但我正在迁移所有内容 我愚蠢地为用户提供了一个完整的WYSIWYG编辑器来完成某些任务,生成的HTML代码当然非常难看,额外的标签比内容多 有人知道我可以使用库或外部shell应用程序来清理代码吗? 我有时会使用tidy,但据我所知,这并不能满足我的要求。我想简化所有额外的span和其他垃圾标签。我用一些正则表达式清除了最具攻击性的样式,但我认为仅仅使用正则表达式做任何事情都需要很长时间 有什么想法吗 标准答案是靓汤 “额外跨度”和“垃圾标

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

我愚蠢地为用户提供了一个完整的WYSIWYG编辑器来完成某些任务,生成的HTML代码当然非常难看,额外的标签比内容多

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

我有时会使用tidy,但据我所知,这并不能满足我的要求。我想简化所有额外的span和其他垃圾标签。我用一些正则表达式清除了最具攻击性的样式,但我认为仅仅使用正则表达式做任何事情都需要很长时间


有什么想法吗

标准答案是
靓汤

“额外跨度”和“垃圾标签”是您需要非常非常仔细地定义的内容,这样您就可以在不删除内容的情况下删除标签

我建议你做两件事

  • 修复你的应用程序,这样用户在任何情况下都不会提供HTML。Django可以使用更加用户友好的RST标记

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


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


    您还可以看看基于白名单的HTML消毒剂。它使用html5lib来实现Kyle发布的功能,但是您可以更好地控制最终输出中允许使用哪些元素和属性。

    标准答案是
    Beautiful Soup
    。“额外的跨度”和“垃圾标签”是需要非常非常仔细地定义的,这样您就可以在不删除内容的情况下删除标签。重做HTML可能比清理现有的HTML更好。
    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 = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom"), tokenizer=sanitizer.HTMLSanitizer)