Как процент-кодировать параметры URL в Python?


Если я это сделаю

url = "http://example.com?p=" + urllib.quote(query)
  1. он не кодирует / to %2F (прерывает нормализацию OAuth)
  2. он не обрабатывает Unicode (он выдает исключение)

есть ли лучшая библиотека?

4 230

4 ответа:

С docs:

urllib.quote(string[, safe])

заменить специальные символы в строке использование % xx escape. Буквы, цифры, и символы '_.- никогда не цитируемый. По умолчанию эта функция предназначен для цитирования раздела пути URL-адреса.Дополнительный безопасный параметр указывает дополнительные символы, которые не следует цитировать -его значение по умолчанию значение '/'

что означает " для безопасной может решить вашу первый вопрос:

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

о второй проблеме, есть сообщение об ошибке об этом здесь. По-видимому, это было исправлено в python 3. Вы можете обойти это путем кодирования как utf8 вроде этого:

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

кстати взгляните на urlencode

отметим, что urllib.quote переехал в urllib.parse.quote в Python3

В Python 3, urllib.quote был перенесен на urllib.parse.quote и он обрабатывает unicode по умолчанию.

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

мой ответ похож на ответ Паоло.

Я думаю, что модуль requests намного лучше. Он основан на urllib3. Вы можете попробовать это:

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

Если вы используете django, вы можете использовать urlquote:

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