Если я делаю
url = "http://example.com?p=" + urllib.quote(query)
- Он не кодирует
/
в%2F
(нарушает нормализацию OAuth) - Он не обрабатывает Unicode (он выдает исключение)
Есть ли лучшая библиотека?
Если я делаю
url = "http://example.com?p=" + urllib.quote(query)
/
в %2F
(нарушает нормализацию OAuth)Есть ли лучшая библиотека?
Из документов:
urllib.quote(string[, safe])
Замените специальные символы в строке, используя escape-символ% xx. Буквы, цифры и символы "_.-" никогда не заключаются в кавычки. По умолчанию эта функция предназначена для цитирования раздела пути URL-адреса. Необязательный параметр safe указывает дополнительные символы, которые не следует заключать в кавычки - его значение по умолчанию равно '/'
Это означает, что прохождение '' для безопасного решения вашей первой проблемы:
>>> 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'
Обратите внимание, что изменения в Python после публикации этого ответа означают, что теперь это устаревшая оболочка. Из исходного кода Django 2.1 для django.utils.http:
A legacy compatibility wrapper to Python urllib.parse.quote() function.
(was used for unicode handling on Python 2)
Здесь лучше использовать urlencode
. Не большая разница для одного параметра, но ИМХО делает код более понятным. (Выглядит quote_plus
видишь функцию quote_plus
! Особенно те, что приходят из других языков)
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