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

2024-05-15 09:20:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我愚蠢地给了用户一个完整的WYSIWYG编辑器来完成某些任务,生成的HTML代码当然非常难看,除了内容之外还有更多的标记。在

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

我有时会用tidy,但据我所知,这不能满足我的要求。我想简化所有额外的span和其他垃圾标签。我用一些正则表达式清除了最具攻击性的样式,但是如果只使用regex,我需要很长时间才能做更多的事情。在

有什么想法吗?在


Tags: django代码用户标记应用程序内容html标签
3条回答

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语法分析器来清理html:

^{pr2}$

标准答案是Beautiful Soup。在

“Extra span”和“garbage tags”是您需要非常非常仔细地定义的内容,这样您就可以在不删除内容的情况下删除这些标记。在

我建议你做两件事。在

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

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

您还可以看看Bleach一个基于白名单的HTML消毒剂。它使用html5lib来完成Kyle发布的内容,但是您将获得更多的控制权,可以在最终输出中允许哪些元素和属性。在

相关问题 更多 >