Кодировать символы Юникода в dict для отправки в качестве данных в запросе POST - PullRequest
1 голос
/ 13 января 2020

Если вы проверите эту страницу (http://buses.com/EN/cr/index.php) и введете в From раздел Golfito и To раздел Cañon del Guarco (дата и другие разделы не очень важны), вы будет перенаправлен на страницу с расписанием. Я играл с запросами в python и хотел сделать это с помощью кода. После проверки, какие данные были отправлены по запросу POST, я создал dict со следующими ключами и значениями

d = {'fromClass': 'Golfito',
'toClass': 'Cañon del Guarco',
'viaClass': '',
'jDate': '01/12/2020',
'jTime': '21:20',
'addtime': '0',
'lang': 'en',
'b2': 'Search connection'}

и вызвал функцию post запросов lib:

r = requests.post('http://horariodebuses.com/EN/cr/index.php', data=d)

и он в основном потерпит неудачу, утверждая, что в их базе данных нет Cañon del Guarco, хотя я смог сделать это через их веб-сайт. (Это можно увидеть самостоятельно, если вы сохраните r как файл html). Однако, если вы измените раздел «Кому» на другой город, в котором нет юникода (например, Liberia, он будет работать. Через код (путем изменения на класс), а также через веб-сайт. Он будет в основном не работать для городов с символами Юникода с помощью кода.

Правильно ли я кодирую свой диктовку?

редактировать: я пытался закодируйте все мои значения с помощью utf-8, выполнив следующее:

data = {k: str(v).encode("utf-8") for k,v in d.items()}

edit2: мне удалось просмотреть данные формы с помощью консоли разработчика Google

1 Ответ

1 голос
/ 13 января 2020

Эта страница не использует UTF-8, но ISO-8859-1 или что-то подобное, потому что она конвертирует ñ в %F1, а ISO-8859-1 конвертирует в \xf1, но также дает результаты.

import requests
import webbrowser

d = {
    'fromClass': 'Golfito',
    'toClass': 'Cañon del Guarco',
    'viaClass': '',
    'jDate': '01/12/2020',
    'jTime': '21:20',
    'addtime': '0',
    'lang': 'en',
    'b2': 'Search connection'
}

d = {k: str(v).encode("ISO-8859-1") for k,v in d.items()}
r = requests.post('http://horariodebuses.com/EN/cr/index.php', data=d)
print(r.encoding)  # ISO-8859-1
print(r.request.body)

with open('output.html', 'wb') as f:
    f.write(r.content)
webbrowser.open('output.html')

РЕДАКТИРОВАТЬ: urllib.parse.urlencode() и заголовок Content-Type': 'application/x-www-form-urlencoded' отправляет %F1 для ñ и + для spaces, и это дает результаты

import requests
import urllib.parse
import webbrowser

d = {
    'fromClass': 'Golfito',
    'toClass': 'Cañon del Guarco',
    'viaClass': '',
    'jDate': '01/12/2020',
    'jTime': '21:34',
    'addtime': '0',
    'lang': 'en',
    'b2': 'Search connection'
}

d = urllib.parse.urlencode(d, encoding='ISO-8859-1')
h = {'Content-Type': 'application/x-www-form-urlencoded'}
#print(d)

r = requests.post('http://horariodebuses.com/EN/cr/index.php', data=d, headers=h)

#print(r.encoding)
#print(r.request.body)
#print(r.request.headers)

with open('output.html', 'wb') as f:
    f.write(r.content)
webbrowser.open('output.html')
...