Wenn ich mache
url = "http://example.com?p=" + urllib.quote(query)
/
zu %2F
(bricht die OAuth-Normalisierung)Gibt es eine bessere Bibliothek?
Aus dem docs :
urllib.quote(string[, safe])
Ersetzen Sie Sonderzeichen in Zeichenfolge mit dem% xx-Escape. Buchstaben, Ziffern, und die Zeichen '_.-' sind niemals zitiert Standardmäßig ist diese Funktion bestimmt zum Zitieren des Pfadabschnitts der URL. Der optionale sichere Parameter gibt zusätzliche Zeichen an, die sollte nicht in Anführungszeichen gesetzt werden - sein Standardwert Wert ist '/'
Das bedeutet, dass '' als sicher übergeben wird, um Ihr erstes Problem zu lösen:
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
Zum zweiten Problem gibt es einen Fehlerbericht hier . Anscheinend wurde es in Python 3 behoben. Sie können es umgehen, indem Sie als utf8 wie folgt codieren:
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
Übrigens: urlencode
Beachten Sie, dass urllib.quote
in Python3 nach urllib.parse.quote
verschoben wurde
In Python 3 wurde urllib.quote
nach urllib.parse.quote
verschoben und er behandelt standardmäßig Unicode.
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
Meine Antwort ist ähnlich wie die von Paolo.
Ich denke, das 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 der Veröffentlichung dieser Antwort bedeuten, dass dies nun ein älterer 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, hier urlencode
zu verwenden. Kein großer Unterschied für einzelne Parameter, aber IMHO macht den Code klarer. (Es sieht verwirrend aus, eine Funktion quote_plus
zu sehen! Vor allem die, die aus anderen Sprachen kommen.)
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