清理丑陋的所见即所得 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 实用程序的主要内容,如果未能解决你的问题,请参考以下文章