python - Six.u() 取消转义 HTML 字符串

标签 python json python-2.7

使用Python 2.7。作为 JSON 响应的一部分,API 返回字符串:

<a href="https://about.twitter.com/products/tweetdeck" rel="nofollow">TweetDeck</a>

我正在使用一个内部执行的库:

six.u(json.dumps(s))

json.dumps() 输出为:

'"<a href=\\"https://about.twitter.com/products/tweetdeck\\" rel=\\"nofollow\\">TweetDeck</a>"'

可以使用 json.loads 正确解码此输出

但是对 six.u 的调用给出:

u'"<a href="https://about.twitter.com/products/tweetdeck" rel="nofollow">TweetDeck</a>"'

尝试使用 json.loads 解码该字符串会引发错误。

ValueError: Extra data: line 1 column 11 - line 1 column 86 (char 10 - 85)

看起来对 six.u 的调用未转义 href 值,但我不完全确定如何解决此问题。

最佳答案

six.u() 适用于 unicode 字符串文字,而不是 JSON 输出。您不应该使用它来将 JSON 解码为 Unicode 字符串。

来自 six.u() documenation :

A “fake” unicode literal. text should always be a normal string literal. In Python 2, u() returns unicode, and in Python 3, a string. Also, in Python 2, the string is decoded with the unicode-escape codec, which allows unicode escapes to be used in it.

强调我的

相反,如果使用 Python 2,则解码字符串:

json_string = json.dumps(s)
if hasattr(json_string, 'decode'):
    # Python 2; decode to a Unicode value
    json_string = json_string.decode('ascii')

或者使用 unicode() 函数并捕获 Python 3 中的 NameError:

json_string = json.dumps(s)
try:
    # Python 2; decode to a Unicode value from ASCII
    json_string = unicode(json_string)
except NameError:
    # Python 3, already Unicode
    pass

或在调用 json.dumps() 时将 ensure_ascii 设置为 False:

json_string = json.dumps(s, ensure_ascii=False)

不过,这仍然可以在 Python 2 中返回 str 类型,但前提是输入仅包含 ASCII 数据,因此输出可以安全地与 unicode 混合> 值(value)观。

无论哪种方式,您都可以在 Python 2 和 Python 3 之间获得一致的值; six.u() 解码还将 \uhhhh JSON Unicode 转义序列解码为 Unicode 代码点,而 Python 3 JSON 结果将保持这些不变。通过解码,您可以在 Python 2 和 3 中保留 \uhhhh 序列,通过 ensure_ascii 您可以在两者中获得 Unicode 代码点。

由于这是一个第三方库,我 filed a bug report ;你无法真正从这个错误中恢复过来;您不能在前面插入额外的反斜杠,然后再将其删除,因为您无法将它们与正常的反斜杠区分开来。

关于python - Six.u() 取消转义 HTML 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30110934/

相关文章:

python - Python 中的异常问题

python - 如何迭代生成集合中所有可能的元素组合

python - Pyshark:如果相同的键名(字段名)显示具有不同值的多个条目,则只能获取第一个字段值

python - 如何在python中统一一个dict列表

python - 将 Matplotlib 中的多个 .png 图形输出到 Python 3.4 中的一个 zip 文件

c# - ServiceStack 支持在每次调用的基础上有条件地从 REST 响应中省略字段

c# - 从 Json 文件中获取选定的结果

python - 为什么我的 Scrapy 蜘蛛没有按预期运行?

python - while循环在Python中连续运行,输入好还是不好?

android - 如何从 url 保存 JSON 并在固定间隔(比如 5 分钟)后从 url 更新保存的文件