Wie kann man die prozentualen URL-Parameter in Python?
Frage
Wenn ich mache
url = "http://example.com?p=" + urllib.quote(query)
- Es codiert nicht
/
zu%2F
(bricht die Normalisierung der OAuth) - Es handelt nicht mit Unicode (es macht eine Ausnahme)
Gibt es eine bessere Bibliothek?
Lösung
Von dem Dokumente:
urllib.quote(string[, safe])
Ersetzen Sie Sonderzeichen in der Zeichenfolge mit dem %xx Escape. Briefe, Ziffern und die Zeichen '_.-' werden nie zitiert. Standardmäßig soll diese Funktion den Pfadabschnitt der URL zitieren. Der optionale sichere Parameter gibt zusätzliche Zeichen an, die nicht zitiert werden sollten - Sein Standardwert ist '/'
Das bedeutet, dass das Bestehen von Safe Ihr erstes Problem lösen wird:
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
Über das zweite Problem gibt es einen Fehlerbericht darüber hier. Anscheinend wurde es in Python 3 fixiert.
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
Übrigens schauen Sie sich an Urlencode
Notiz das urllib.quote
umgezogen nach urllib.parse.quote
in Python3
Andere Tipps
In Python 3, urllib.quote
wurde zugezogen zu urllib.parse.quote
und es wird standardmäßig Unicode behandelt.
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
Meine Antwort ähnelt Paolos Antwort.
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'
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öffentlicht wurden, bedeutet, dass dies jetzt eine ältere Wrapper ist. Aus dem Quellcode Django 2.1 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 zu verwenden urlencode
hier. 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 diejenigen aus anderen Sprachen)
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
Dokumente
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