/ / six.u () HTML-Zeichenfolge aufheben - Python, Json, Python-2.7

six.u () entkommt HTML-String - Python, Json, Python-2.7

Python verwenden 2.7. Als Teil einer JSON-Antwort gibt eine API die Zeichenfolge zurück:

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

Ich verwende eine Bibliothek, die intern:

six.u(json.dumps(s))

json.dumps() Ausgabe ist:

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

Diese Ausgabe kann mit korrekt dekodiert werden json.loads

Aber der Anruf an six.u gibt:

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

Und versuchen, diese Zeichenfolge mit zu decodieren json.loads löst einen Fehler aus.

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

Sieht aus wie der Anruf an six.u entkam der href Wert, aber ich bin nicht ganz sicher, wie ich das beheben kann.

Antworten:

1 für die Antwort № 1

six.u() ist für gemeint Unicode-String-Literale, keine JSON-Ausgabe. Sie sollten es nicht verwenden, um den JSON in eine Unicode-Zeichenfolge zu decodieren.

Von dem six.u() Dokumentation:

Ein "falscher" Unicode-Literal. text sollte immer ein normales String-Literal sein. In Python 2 u() gibt Unicode und in Python 3 einen String zurück. In Python 2 wird die Zeichenfolge auch mit der Zeichenfolge decodiert unicode-escape Codec, der die Verwendung von Unicode-Escape-Codes ermöglicht.

Betonung meiner.

Dekodieren Sie stattdessen die Zeichenfolge, wenn Sie Python 2 verwenden:

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

oder benutze die unicode() Funktion und fangen die NameError in Python 3:

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

oder einstellen ensure_ascii zu False beim Anrufen json.dumps():

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

Dies kann immer noch zurückkehren str Geben Sie jedoch Python 2 ein, aber nur, wenn die Eingabe nur Daten enthält, die nur aus ASCII-Daten bestehen unicode Werte.

So oder so bekommen Sie konsistente Werte zwischen Python 2 und Python 3 Das six.u() decodiert auch decodiert uhhhh JSON Unicode-Escape-Sequenzen zu Unicode-Codepunkten, während das Python 3-JSON-Ergebnis diese intakt lässt. Mit der Dekodierung behalten Sie die uhhhh Sequenzen in Python 2 und 3 mit ensure_ascii Sie erhalten in beiden Unicode-Codepunkte.

Da dies eine Drittanbieter-Bibliothek ist, habe ich einen Fehlerbericht eingereicht; Sie können sich von diesem Fehler nicht wirklich erholen. Sie können keine zusätzlichen Backslashes vorne einfügen und sie anschließend entfernen, da Sie diese nicht von normalen Backslashes unterscheiden können.