Если я делаю
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