Как я могу избежать определенных символов при использовании python's urllib.urlencode ()? - PullRequest
0 голосов
/ 23 июня 2019

У меня есть словарь, который я хочу urlencode в качестве параметров запроса. Сервер, на который я нажимаю, ожидает, что запрос будет выглядеть так: http://www.example.com?A=B,C

Но когда я пытаюсь использовать urllib.urlencode для создания URL, я обнаруживаю, что запятая превращается в %2C:

>>> import urllib
>>> urllib.urlencode({"A":"B,C"})
'A=B%2CC'

Можно ли как-нибудь избежать запятой, чтобы urlencode воспринимал ее как нормальный символ?

Если нет, как я могу обойти эту проблему?

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Вы можете сделать это, добавив query params в виде строки перед попаданием в конечную точку.

Я использовал requests для выполнения запроса.

Например:

GET Request

import requests

url = "https://www.example.com/?"
query = "A=B,C"

url_final = url + query

url  = requests.get(url_final)

print(url.url)
# https://www.example.com/?A=B,C

Запятая (вместе с некоторыми другими символами) определена в RFC 3986 как зарезервированный символ.Это означает, что запятая имеет определенное значение в различных частях URL-адреса, и если она не используется в этом контексте, ее необходимо кодировать в процентах.

При этом параметр запроса не дает запятому никакого специального синтаксиса, поэтому в параметрах запроса мы, вероятно, не должны его кодировать.Тем не менее, это не совсем ошибка Запросов: параметры кодируются с использованием urllib.urlencode(), то есть процентного кодирования параметров запроса.

Это не легко исправить, хотяпотому что некоторые веб-сервисы используют ,, а некоторые используют %2C, и ни один не является неправильным.Возможно, вам придется самостоятельно обработать эту кодировку.

0 голосов
/ 23 июня 2019

Вы можете экранировать определенные символы, явно указав их в качестве безопасного значения аргумента

urllib.quote(str, safe='~()*!.\'')

Подробнее: https://docs.python.org/3.0/library/urllib.parse.html#urllib.parse.quote

...