Como codificar por porcentagem os parâmetros de URL no Python?




urllib.urlencode python 3 (4)

É melhor usar o urlencode aqui. Não há muita diferença para o parâmetro único, mas o IMHO torna o código mais claro. (Parece confuso para ver uma função quote_plus ! Especialmente aqueles provenientes de outros languados)

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: docs.python.org/3/library/…

Se eu fizer

url = "http://example.com?p=" + urllib.quote(query)
  1. Não codifica / para %2F (quebra a normalização OAuth)
  2. Não manipula Unicode (lança uma exceção)

Existe uma biblioteca melhor?


No Python 3, o urllib.quote foi movido para o urllib.parse.quote e manipula o unicode por padrão.

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

Minha resposta é semelhante à resposta de Paolo.

Eu acho que os requests módulo são muito melhores. É baseado no urllib3 . Você pode tentar isto:

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

Se você estiver usando o django, você pode usar o urlquote:

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

Observe que as alterações no Python desde que essa resposta foi publicada significam que agora é um wrapper herdado. Do código-fonte do Django 2.1 para django.utils.http:

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




urlencode