【问题标题】:How do I escape closing '/' in HTML tags in JSON with Python?如何使用 Python 在 JSON 中的 HTML 标记中转义关闭“/”?
【发布时间】:2013-02-24 04:14:11
【问题描述】:

注意:这个问题与Embedding JSON objects in script tags 非常接近,但对该问题的回答提供了我已经知道的内容(在 JSON 中 / == \/)。我想知道如何进行转义。

HTML 规范禁止在 <script> 元素中的任何位置使用封闭的 HTML 标记。因此,这会导致解析错误:

<script>
var assets = [{
  "asset_created": null, 
  "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", 
  "body": "<script></script>"
}];
</script>

就我而言,我通过在 Django 模板中呈现 JSON 字符串来生成无效情况,即:

<script>
var assets = {{ json_string }};
</script>

我知道 JSON 解析 \// 相同,所以如果我可以在 JSON 字符串中转义我的结束 HTML 标记,我会很好。但是,我不确定最好的方法。

我的幼稚做法是这样的:

json_string = '[{"asset_created": null, "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "<script></script>"}]'
escaped_json_string = json_string.replace('</', r'<\/')

有没有更好的方法?还是我忽略的任何问题?

【问题讨论】:

    标签: python html django escaping


    【解决方案1】:

    更新答案

    好吧,我猜错了几件事。对于转义 JSON,simplejson 库有一个方法 JSONEncoderForHTML 可以使用。如果代码不起作用,您可能需要通过pipeasy_install 安装它。然后你可以这样做:

    import simplejson
    asset_json=simplejson.loads(json_string)
    encoded=simplejson.encoder.JSONEncoderForHTML().encode(assets_json)
    

    encoded 会给你这个:

    '{"asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "\\u003cscript\\u003e\\u003c/script\\u003e", "asset_created": null}'
    

    这是一个比斜杠替换更全面的解决方案,因为它还处理其他编码警告。

    loads 部分是 JSON 已编码的副作用。如果可能的话,可以通过不使用 DJango 来生成 JSON 而使用 simplejson 来避免这种情况:

    simplejson.dumps(your_object_to_encode, cls=simplejson.encoder.JSONEncoderForHTML)
    

    旧答案

    尝试将您的脚本包装在CDATA

    <script>
    //<![CDATA[
    var assets = [{
      "asset_created": null, 
      "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", 
      "body": "<script></script>"
    }];
    //]]>
    </script>
    

    它的目的是在这类事情上标记解析器。否则,您将需要使用已经提到的字符转义。

    【讨论】:

    • 但这仅适用于 XHTML,对吧?对于&lt;!doctype html&gt;CDATA 似乎不起作用。这就是为什么我更喜欢在 JSON 中转义 \/ 的原因。问题更多是关于如何对转义进行字符串替换,而不是如何转义文本本身。
    • @GeoffreyHing 啊,是的,我错误地假设了 XHTML 部分。我已经更新了 DJango 转义部分的答案。
    • @GeoffreyHing:django 附带了自己的 simplejson 副本,您可以使用 from django.utils import simplejson 导入它,因此您无需单独安装。
    • @LieRyan,不幸的是,看起来 Django 附带的 simplejson 版本(至少 1.4)不包括JSONEncoderForHTML 编码器。
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2011-11-20
    • 2022-10-15
    • 1970-01-01
    相关资源
    最近更新 更多