Ersetzen Sie Sonderzeichen in der Zeichenfolge mit dem Escapezeichen% xx. Buchstaben, Ziffern und die Zeichen '_.-' werden niemals in Anführungszeichen gesetzt. Standardmäßig dient diese Funktion zum Zitieren des Pfadabschnitts der URL. Der optionale Parameter safe gibt zusätzliche Zeichen an, die nicht in Anführungszeichen gesetzt werden sollen. Der Standardwert ist '/'.
Das bedeutet, dass das sichere Bestehen von '' Ihr erstes Problem löst:
Über das zweite Problem gibt es hier einen Fehlerbericht . Anscheinend wurde es in Python 3 behoben. Sie können es umgehen, indem Sie es wie folgt als utf8 codieren:
Danke, beide haben super funktioniert. urlencode ruft nur viele Male quoteplus in einer Schleife auf, was nicht die richtige Normalisierung für meine Aufgabe ist (oauth).
Paul Tarjan
6
Die Spezifikation: rfc 2396 definiert diese als reserviert. reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","Damit befasst sich urllib.quote.
Jeff Sheffield
63
urllib.quoteumgezogen urlib.parse.quote, seit Python3.
Wenn Sie eine Suchabfrage codieren, ist es möglicherweise besser, quote_plus zu verwenden: docs.python.org/3/library/… 1. Standardmäßig werden Schrägstriche codiert. 2. Außerdem werden Leerzeichen codiert
Der Name quoteist als global eher vage. Es könnte schöner sein, so etwas wie Urlencode zu verwenden : from urllib.parse import quote as urlencode.
Luc
Beachten Sie, dass es eine Funktion mit dem Namen ist urlencodein urllib.parsebereits , dass etwas ganz anderes tut, so dass Sie besser sein würde aus anderen Namen Kommissionierung oder das Risiko ernst zukünftige Leser Ihres Codes verwirrend.
jaymmer - Monica
48
Meine Antwort ähnelt der Antwort von Paolo.
Ich denke Modul requestsist viel besser. Es basiert auf urllib3. Sie können dies versuchen:
Beachten Sie, dass Änderungen an Python seit Veröffentlichung dieser Antwort bedeuten, dass dies jetzt ein Legacy-Wrapper ist. Aus dem Django 2.1-Quellcode für django.utils.http:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
Es ist besser, urlencodehier zu verwenden . Kein großer Unterschied für einzelne Parameter, aber IMHO macht den Code klarer. (Es sieht verwirrend aus, eine Funktion zu sehen quote_plus! Besonders die, die aus anderen Sprachen stammen)
Antworten:
Python 2
Aus den Dokumenten :
Das bedeutet, dass das sichere Bestehen von '' Ihr erstes Problem löst:
Über das zweite Problem gibt es hier einen Fehlerbericht . Anscheinend wurde es in Python 3 behoben. Sie können es umgehen, indem Sie es wie folgt als utf8 codieren:
Schauen Sie sich übrigens urlencode an
Python 3
Das gleiche, nur ersetzen
urllib.quote
miturllib.parse.quote
.quelle
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Damit befasst sich urllib.quote.urllib.quote
umgezogenurlib.parse.quote
, seit Python3.urllib.parse.quote
docsIn Python 3
urllib.quote
wurde nach verschobenurllib.parse.quote
und es verarbeitet standardmäßig Unicode.quelle
quote
ist als global eher vage. Es könnte schöner sein, so etwas wie Urlencode zu verwenden :from urllib.parse import quote as urlencode
.urlencode
inurllib.parse
bereits , dass etwas ganz anderes tut, so dass Sie besser sein würde aus anderen Namen Kommissionierung oder das Risiko ernst zukünftige Leser Ihres Codes verwirrend.Meine Antwort ähnelt der Antwort von Paolo.
Ich denke Modul
requests
ist viel besser. Es basiert aufurllib3
. Sie können dies versuchen:quelle
requests.utils.quote
ist Link zu Pythonquote
. Siehe Anforderungsquellen .requests.utils.quote
ist ein dünner Kompatibilitäts-Wrapperurllib.quote
für Python 2 undurllib.parse.quote
für Python 3Wenn Sie Django verwenden, können Sie urlquote verwenden:
Beachten Sie, dass Änderungen an Python seit Veröffentlichung dieser Antwort bedeuten, dass dies jetzt ein Legacy-Wrapper ist. Aus dem Django 2.1-Quellcode für django.utils.http:
quelle
Es ist besser,
urlencode
hier zu verwenden . Kein großer Unterschied für einzelne Parameter, aber IMHO macht den Code klarer. (Es sieht verwirrend aus, eine Funktion zu sehenquote_plus
! Besonders die, die aus anderen Sprachen stammen)Docs
Urlencode: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
quote_plus: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus
quelle