Wenn ich mache
url = "http://example.com?p=" + urllib.quote(query)
- Es codiert nicht
/
zu%2F
(unterbricht die OAuth-Normalisierung) - Unicode wird nicht behandelt (es wird eine Ausnahme ausgelöst)
Gibt es eine bessere Bibliothek?
Wenn ich mache
url = "http://example.com?p=" + urllib.quote(query)
/
zu %2F
(unterbricht die OAuth-Normalisierung)Gibt es eine bessere Bibliothek?
Antworten:
Aus den Dokumenten :
urllib.quote(string[, safe])
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:
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
Ü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:
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
Schauen Sie sich übrigens urlencode an
Das gleiche, nur ersetzen urllib.quote
mit urllib.parse.quote
.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Damit befasst sich urllib.quote.
urllib.quote
umgezogen urlib.parse.quote
, seit Python3.
urllib.parse.quote
docs
In Python 3 urllib.quote
wurde nach verschoben urllib.parse.quote
und es verarbeitet standardmäßig Unicode.
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
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
in urllib.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 auf urllib3
. Sie können dies versuchen:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
requests.utils.quote
ist ein dünner Kompatibilitäts-Wrapper urllib.quote
für Python 2 und urllib.parse.quote
für Python 3
Wenn Sie Django verwenden, können Sie urlquote verwenden:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
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, 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 sehen quote_plus
! Besonders die, die aus anderen Sprachen stammen)
In [21]: query='lskdfj/sdfkjdf/ksdfj skfj'
In [22]: val=34
In [23]: from urllib.parse import urlencode
In [24]: encoded = urlencode(dict(p=query,val=val))
In [25]: print(f"http://example.com?{encoded}")
http://example.com?p=lskdfj%2Fsdfkjdf%2Fksdfj+skfj&val=34
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