416 Stimmen

Wie kann ich URL-Parameter in Python prozentual codieren?

Wenn ich das tue

url = "http://example.com?p=" + urllib.quote(query)
  1. Es kodiert nicht / a %2F (bricht die OAuth-Normalisierung)
  2. Unicode wird nicht verarbeitet (es wird eine Ausnahme ausgelöst)

Gibt es eine bessere Bibliothek?

535voto

Nadia Alramli Punkte 105256

Python 2

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 .

Python 3

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

210voto

Paolo Moretti Punkte 50959

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/'

63voto

Aminah Nuraini Punkte 15960

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>.

15voto

Rick Westera Punkte 2905

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)

5voto

balki Punkte 24248

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

Dokumentation

CodeJaeger.com

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.

Powered by:

X