У меня проблема с кодировкой URL-адресов в модуле запросов проекта Python.

Это два разных параметра с кодировкой URL, которые я получил из пакета wirehark.

  1. 0900 +% 28% EB% 8C% 80% ED% 95% 9C% EB% AF% BC% EA% B5% AD +% ED% 91% 9C% EC% A4% 80% EC% 8B% 9C% 29
  2. 0900% 20 (% EB% 8C% 80% ED% 95% 9C% EB% AF% BC% EA% B5% AD% 20% ED% 91% 9C% EC% A4% 80% EC% 8B% 9C)

«1» - это URL-адрес, закодированный модулем запросов python, а «2» - это URL-адрес из отправленного веб-браузером пакета. Когда я декодирую их оба, он показывает один и тот же текст utf-8.

Кажется, что обработка пробелов и скобок у них разная. Есть ли способ изменить «1» на «2»?

Вот коды, которые я использовал для отправки запроса

_url = "http://something"
_headers = {
    'Accept': 'text/javascript',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'ko-KR',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}
_params = {
    'action': 'log',
    'datetime': '0900 (대한민국 표준시)'
    }

# This is the request part
session = requests.Session()
res = session.get(_url, headers=_headers, params=_params)
1
Gongmeda 12 Фев 2021 в 10:36

1 ответ

Лучший ответ

Вы можете вручную закодировать свой _params, чтобы создать свою строку запроса , а затем объединить ее со своим _url.

Вы можете использовать urllib.parse.urlencode < / strong> [Python-Docs], чтобы преобразовать ваш словарь _params в текстовую строку ASCII с процентной кодировкой. Результирующий строка - это серия пар key=value, разделенных символами &, где ключ и значение заключены в кавычки с использованием функции quote_via. К по умолчанию, quote_plus() используется для цитирования значений, которые означает, что пробелы заключаются в кавычки как символ +, а символы / - кодируется как %2F, что соответствует стандарту для запросов GET (приложение / x-www-form-urlencoded). Альтернативная функция, которая может быть передается как quote_via - это { {X10}} , который будет кодировать пробелы как %20 и не кодировать символы /. Для максимального контроля над тем, что есть в кавычках используйте quote и укажите значение для безопасности.


from urllib.parse import quote_plus, quote, urlencode
import requests

url_template = "http://something/?{}"
_headers = { ... }
_params = {"action": "log", "datetime": "0900 (대한민국 표준시)"}
_url = url_template.format(urlencode(_params, safe="()", quote_via=quote))

response = requests.get(_url, headers=_headers)
0
Vishal Singh 12 Фев 2021 в 10:27