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