Domanda

Se lo faccio

url = "http://example.com?p=" + urllib.quote(query)
  1. Non codifica / A %2F (interrompe la normalizzazione OAuth)
  2. Non gestisce Unicode (genera un'eccezione)

Esiste una libreria migliore?

È stato utile?

Soluzione

Dal documenti:

urllib.quote(string[, safe])

Sostituisci caratteri speciali nella stringa usando la fuga %xx.Lettere, cifre e i personaggi '_.-' non sono mai citati.Per impostazione predefinita, questa funzione è destinata a citare la sezione del percorso dell'URL. Il parametro sicuro facoltativo specifica ulteriori caratteri che non dovrebbero essere citati - Il suo valore predefinito è '/'

Ciò significa che passare '' per sicuro risolverà il tuo primo problema:

>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'

Per quanto riguarda il secondo problema, c'è una segnalazione di bug a riguardo Qui.Apparentemente è stato risolto in Python 3.Puoi risolvere il problema codificando come utf8 in questo modo:

>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller

A proposito, dai un'occhiata urlencode

Nota Quello urllib.quote trasferito a urllib.parse.quote in Python3

Altri suggerimenti

In Python 3, urllib.quote è stato spostato a < a href = "http://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote" rel = "noreferrer"> urllib.parse.quote e consente di gestire Unicode per impostazione predefinita.

>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'

La mia risposta è simile alla risposta di Paolo.

Credo modulo requests è molto meglio. Si basa su urllib3. Si può provare questo:

>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'

Se stai usando Django, è possibile utilizzare urlquote:

>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'

Nota che cambia a Python dato questa risposta è stata pubblicata significa che questo è ormai un involucro legacy. Dal codice sorgente Django 2.1 per django.utils.http:

A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)

E 'meglio utilizzare urlencode qui. Non c'è molta differenza per singolo parametro, ma secondo me rende il codice più chiaro. (Sembra confuso per vedere una funzione quote_plus! Specialmente quelli provenienti da altre languates)

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

Documenti

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top