Если я сделаю
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
.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Это то, с чем имеет дело urllib.quote.
urllib.quote
перешел на urlib.parse.quote
, начиная с Python3.
urllib.parse.quote
документы
В 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/'
quote
довольно расплывчато как глобальное. Может быть , лучше использовать что - то вроде UrlEncode: from urllib.parse import quote as urlencode
.
urlencode
в urllib.parse
уже , что делает что - то совсем другое, так что вы бы лучше выбирать другое имя или риск серьезно заблуждение читателей в будущем вашего кода.
Мой ответ похож на ответ Паоло.
Я думаю, что модуль requests
намного лучше. Это основано на urllib3
. Вы можете попробовать это:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
requests.utils.quote
тонкая оболочка совместимости urllib.quote
для Python 2 и urllib.parse.quote
Python 3
Если вы используете 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's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
Лучше использовать urlencode
здесь. Не большая разница для одного параметра, но IMHO делает код более понятным. (Это выглядит сбивающим с толку, чтобы увидеть функцию 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