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

Posted

技术标签:

【中文标题】清理丑陋的所见即所得 HTML 代码? Python 或 *nix 实用程序【英文标题】:Clean up ugly WYSIWYG HTML code? Python or *nix utility 【发布时间】:2011-08-27 01:30:05 【问题描述】:

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

我愚蠢地给了用户一个完整的WYSIWYG编辑器来完成某些任务,生成的html代码当然非常丑陋,带有比内容更多的额外标签。

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

我有时会使用 tidy,但据我所知,这并不能满足我的要求。我想简化所有额外的跨度和其他垃圾标签。我用一些正则表达式清理了最令人反感的违规样式,但我需要很长时间才能使用正则表达式来做更多的事情。

有什么想法吗?

【问题讨论】:

标准答案是Beautiful Soup。 “额外的跨度”和“垃圾标签”是您需要非常非常仔细地定义的东西,这样您就可以在不删除内容的情况下删除标签。 可能重做 HTML 而不是清理你拥有的 HTML 是一个更好的主意。 【参考方案1】:

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

【讨论】:

【参考方案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)

【讨论】:

【参考方案3】:

标准答案是Beautiful Soup

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

我建议你做两件事。

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

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

【讨论】:

以上是关于清理丑陋的所见即所得 HTML 代码? Python 或 *nix 实用程序的主要内容,如果未能解决你的问题,请参考以下文章

所见即所得 - execCommand 使用 HTML5 正确更改字体和字体大小

为啥我的所见即所得编辑器在 vuejs 中运行如此缓慢?

GWT 的所见即所得编辑器组件

在GitHub/Gitee上,搭建一个简单的所见即所得博客

jsp中的所见即所得编辑器[关闭]

css 用于移动模板的所见即所得颜色重置