it-swarm.com.de

Wie kodiere ich URL-Parameter in Python?

Wenn ich mache 

url = "http://example.com?p=" + urllib.quote(query)
  1. Es codiert nicht / zu %2F (bricht die OAuth-Normalisierung)
  2. Es behandelt nicht Unicode (es löst eine Ausnahme aus)

Gibt es eine bessere Bibliothek?

246
Paul Tarjan

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

336
Nadia Alramli

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/'
141
Paolo Moretti

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'
38
Aminah Nuraini

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)
10
Rick Westera

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

Docs

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

0
balki