Wenn ich das tue
url = "http://example.com?p=" + urllib.quote(query)
- Es kodiert nicht
/
a%2F
(bricht die OAuth-Normalisierung) - Unicode wird nicht verarbeitet (es wird eine Ausnahme ausgelöst)
Gibt es eine bessere Bibliothek?
Wenn ich das tue
url = "http://example.com?p=" + urllib.quote(query)
/
a %2F
(bricht die OAuth-Normalisierung)Gibt es eine bessere Bibliothek?
En die Dokumentation :
urllib.quote(string[, safe])
Ersetzen von Sonderzeichen in einer Zeichenkette mit der Escape-Funktion %xx. Buchstaben, Ziffern, und die Zeichen '_.-' werden nie in Anführungszeichen gesetzt. Standardmäßig ist diese Funktion für die Anführung des Pfadabschnitts der URL gedacht. Der optionale Parameter safe gibt zusätzliche Zeichen an, die nicht in Anführungszeichen gesetzt werden sollen - sein Standard Wert ist "/".
Das bedeutet, dass die ''
para sicher wird Ihr erstes Problem lösen:
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
Zur zweiten Frage: Es gibt einen Fehlerbericht darüber . Anscheinend wurde es in Python 3 behoben. Sie können es umgehen, indem Sie kodieren als UTF-8 wie diese:
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
Übrigens, werfen Sie einen Blick auf urlencode .
In Python 3 ist die Funktion quote
wurde verschoben nach urllib.parse
:
>>> import urllib.parse
>>> print(urllib.parse.quote("Müller".encode('utf8')))
M%C3%BCller
>>> print(urllib.parse.unquote("M%C3%BCller"))
Müller
In Python 3, urllib.quote
wurde verschoben nach urllib.parse.quote
und es behandelt Unicode standardmäßig.
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
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'
Meine Antwort ist ähnlich wie <a href="https://stackoverflow.com/questions/1695183/how-can-i-percent-encode-url-parameters-in-python/13625238#13625238">Paolos Antwort </a>.
Wenn Sie Folgendes verwenden Django können Sie verwenden urlquote :
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
Beachten Sie, dass Änderungen an Python bedeuten, dass dies nun 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 zu verwenden urlencode
hier. Bei einem einzigen Parameter ist der Unterschied nicht groß, aber IMHO wird der Code dadurch klarer. (Es sieht verwirrend aus, wenn eine Funktion quote_plus
! - vor allem solche, 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
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.