Динамически генерировать URL в Python - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы программно сгенерировать URL, созданный этими частями

Фиксированная часть

https://booking.snav.it/#/booking/rates/

Номер исходящего маршрута - изменения

1040

Дата отправки - изменения

19-02-2019

Номер входящего маршрута - изменения

1042

Дата прибытия - изменения

20-02-2019

Параметры:

"adults": "1"
"childs":"0"
"infants":"0"
"res": "0"
"vehicle":"0"

Вывод

https://booking.snav.it/#/booking/rates/1040/19-02-2019/1042/19-02-2019?adults=1&childs=0&infants=0&res=0&vehicle=0

Я знаю, как передать параметры с urllib.parse.urlencode

params = urllib.parse.urlencode({
   "adults": "1"
    "childs":"0"
    "infants":"0"
    "res": "0"
    "vehicle":"0"
})

url = "https://booking.snav.it/#/booking/rates/"
res = requests.get(url, params=params)

, но не знаю, как динамически построить первую часть после фиксированного URL 1040/19-02-2019/1042/19-02-2019

1 Ответ

0 голосов
/ 21 февраля 2019

URL на самом деле является просто строкой, здесь подойдет любая из обычных техник манипуляции со строками.В ваших компонентных деталях нет символов, которые также потребовали бы здесь кодирования URL, что упрощает весь процесс.

Если у вас есть компоненты, в которых используются символы, которых нет в списке незарезервированных символов , затем используйте функцию urllib.parse.quote() для преобразования этих символов в компоненты, безопасные для URL.

Вы можете использовать str.join() с / для объединения частей строки:

outbound_route = '1040'
outbound_date = '19-02-2019'
inbound_route = '1042'
inbound_date = '20-02-2019'

url = "https://booking.snav.it/#/booking/rates"  # no trailing /
final_url = '/'.join([url, outbound_route, outbound_date, inbound_route, inbound_date])

или вы можете использовать форматированный строковый литерал :

url = "https://booking.snav.it/#/booking/rates/"
final_url = f'{url}{outbound_route}/{outbound_date}/{inbound_route}/{inbound_date}'

Преимущество этого подхода состоит в том, что компоненты не обязательно должны быть строками;если outbound_route и inbound_route являются целыми числами, вам не нужно сначала явно преобразовывать их в строки.

Или, поскольку пути URL работают во многом как пути файловой системы POSIX, вы можете использовать pathlib.PosixPurePath() class для создания пути:

from pathlib import PosixPurePath

path = PosixPurePath('/booking/rates') / outbound_route / outbound_date / inbound_route / inbound_date
final_url = f"https://booking.snav.it/#{path}"

Во всех случаях вы получите окончательный URL-адрес для использования в requests:

res = requests.get(final_url, params=params)
...