绕过html5lib / bleach中的特定HTML清理

时间:2014-05-07 22:00:49

标签: python html5lib

我正在使用bleach,它使用html5lib来清除用户生成的内容,这些内容是设计为dust.js模板的HTML片段

除了这种情况外,一切都运行良好 -

输入:

<table>
    {#loop}
      <tr>
         <td>{name}</td>
      </tr>
    {/loop}
</table>

输出:

    {#loop}
    {/loop}
<table>
      <tr>
         <td>{name}</td>
      </tr>
</table>

循环标记正在表外排序。这很有道理 - html5lib正在纠正我的HTML;内容不应该在表结构中,除非它包含在td / th标记中。我通常希望这样的修正发生,并且仍然希望修正发生 - 但我想知道是否有办法以某种方式获得这些标记。

过去有没有人遇到类似的情况,并且能够抑制这种消毒行为?

到目前为止我唯一提出的方法是将控件包装在一个我可以正确删除的标签中:

<table>
    <tr data-layout=""><td>{#loop}</td></tr>
      <tr>
         <td>{name}</td>
      </tr>
    <tr data-layout=""><td>{/loop}</td></tr>
</table>

这种方法的问题在于,一旦我将这种格式化hack重新编写,我就无法轻易地将其重新构建。编码模板变得不可编辑。

2 个答案:

答案 0 :(得分:1)

这根本不涉及清理,这是关于解析(按规格!)。 Foster-parenting是HTML解析器直接处理表元素中的大多数内容的方式;要更改此信息,您必须更改html5parser.py中的解析器。 html5lib旨在实现一致的HTML解析器 - 它没有API使其不符合。

答案 1 :(得分:-1)

Bleach内置了white-list标签/属性。但是,您可以扩展或覆盖现有的白名单标记/属性。以下是如何将自定义标记添加到现有“白名单”的示例;

bleach.ALLOWED_TAGS.extend( ['{#*}' , '{/*}' ] )

简单的漂白将标记&#34; {#loop} {/ loop}&#34;标签可以安全逃脱。

** Bleach official documentation提供了有关如何定义通配符白名单标记/属性的详细信息。