Frage

Wenn ich mache

url = "http://example.com?p=" + urllib.quote(query)
  1. Es codiert nicht / zu %2F (bricht die Normalisierung der OAuth)
  2. Es handelt nicht mit Unicode (es macht eine Ausnahme)

Gibt es eine bessere Bibliothek?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top