Замените специальные символы в строке, используя escape-символ% xx. Буквы, цифры и символы «_.-» никогда не заключаются в кавычки. По умолчанию эта функция предназначена для цитирования раздела пути URL-адреса. Необязательный параметр safe указывает дополнительные символы, которые не следует заключать в кавычки - его значение по умолчанию равно '/'
Это означает, что прохождение '' для безопасного решения вашей первой проблемы:
Спасибо вам, оба работали отлично. urlencode просто вызывает quoteplus много раз в цикле, что не является правильной нормализацией для моей задачи (oauth).
Пол Тарьян
6
spec: rfc 2396 определяет их как зарезервированные. reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","Это то, с чем имеет дело urllib.quote.
Джефф Шеффилд,
63
urllib.quoteперешел на urlib.parse.quote, начиная с Python3.
Кроме того, в случае кодирования поискового запроса, возможно, лучше использовать quote_plus: docs.python.org/3/library/… 1. Он по умолчанию кодирует косую черту 2. Он также кодирует пробелы
Название quoteдовольно расплывчато как глобальное. Может быть , лучше использовать что - то вроде UrlEncode: from urllib.parse import quote as urlencode.
Люк
Обратите внимание , что существует функция с именем urlencodeв urllib.parseуже , что делает что - то совсем другое, так что вы бы лучше выбирать другое имя или риск серьезно заблуждение читателей в будущем вашего кода.
Jaymmer - Восстановить Монику
48
Мой ответ похож на ответ Паоло.
Я думаю, что модуль requestsнамного лучше. Это основано на urllib3. Вы можете попробовать это:
Обратите внимание, что изменения в 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! Особенно те, которые приходят от других томится)
Ответы:
Python 2
Из документов :
Это означает, что прохождение '' для безопасного решения вашей первой проблемы:
О втором вопросе, есть ошибка отчет об этом здесь . Очевидно, это было исправлено в python 3. Вы можете обойти это, кодируя как utf8 так:
Кстати, посмотрите на urlencode
Python 3
То же самое, кроме замены
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.источник
quote
довольно расплывчато как глобальное. Может быть , лучше использовать что - то вроде UrlEncode:from urllib.parse import quote as urlencode
.urlencode
вurllib.parse
уже , что делает что - то совсем другое, так что вы бы лучше выбирать другое имя или риск серьезно заблуждение читателей в будущем вашего кода.Мой ответ похож на ответ Паоло.
Я думаю, что модуль
requests
намного лучше. Это основано наurllib3
. Вы можете попробовать это:источник
requests.utils.quote
это ссылка на питонаquote
. Смотрите источники запросов .requests.utils.quote
тонкая оболочка совместимостиurllib.quote
для Python 2 иurllib.parse.quote
Python 3Если вы используете django, вы можете использовать urlquote:
Обратите внимание, что изменения в Python после публикации этого ответа означают, что теперь это устаревшая оболочка. Из исходного кода Django 2.1 для django.utils.http:
источник
Лучше использовать
urlencode
здесь. Не большая разница для одного параметра, но IMHO делает код более понятным. (Это выглядит сбивающим с толку, чтобы увидеть функциюquote_plus
! Особенно те, которые приходят от других томится)Документы
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
источник