Se lo faccio
url = "http://example.com?p=" + urllib.quote(query)
- Non codifica
/
in%2F
(interrompe la normalizzazione OAuth) - Non gestisce Unicode (genera un'eccezione)
C'è una biblioteca migliore?
Se lo faccio
url = "http://example.com?p=" + urllib.quote(query)
/
in %2F
(interrompe la normalizzazione OAuth)C'è una biblioteca migliore?
Risposte:
Dai documenti :
urllib.quote(string[, safe])
Sostituisci i caratteri speciali nella stringa usando l'escape% xx. Lettere, cifre e caratteri '_.-' non vengono mai citati. Per impostazione predefinita, questa funzione è intesa per citare la sezione del percorso dell'URL. Il parametro sicuro opzionale specifica caratteri aggiuntivi che non devono essere citati - il suo valore predefinito è '/'
Ciò significa che passare '' per sicurezza risolverà il tuo primo problema:
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
Circa la seconda questione, v'è una segnalazione di bug su di esso qui . Apparentemente è stato risolto in Python 3. Puoi aggirarlo 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 a urlencode
Lo stesso, tranne sostituire urllib.quote
con urllib.parse.quote
.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
cosa si occupa urllib.quote.
urllib.quote
spostato a urlib.parse.quote
, da Python3.
urllib.parse.quote
documenti
In Python 3, urllib.quote
è stato spostato urllib.parse.quote
e gestisce unicode per impostazione predefinita.
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
quote
è piuttosto vago come globale. Potrebbe essere più bello di usare qualcosa come UrlEncode: from urllib.parse import quote as urlencode
.
urlencode
in urllib.parse
già che fa qualcosa di completamente diverso, quindi faresti meglio a prendere un altro nome o rischi seriamente confondere i lettori futuri del codice.
La mia risposta è simile alla risposta di Paolo.
Penso che il modulo requests
sia molto meglio. Si basa su urllib3
. Puoi provare questo:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
requests.utils.quote
è un wrapper di compatibilità sottile urllib.quote
per Python 2 e urllib.parse.quote
Python 3
Se stai usando Django, puoi usare urlquote:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
Si noti che le modifiche a Python da quando è stata pubblicata questa risposta significano che ora è un wrapper 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)
È meglio usare urlencode
qui. Non molta differenza per singolo parametro, ma IMHO rende il codice più chiaro. (Sembra confuso vedere una funzione quote_plus
! Soprattutto quelli che provengono da altri linguaggi)
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