在 python 中动态生成 URL

Generate dynamically URL in python

我想以编程方式生成由这些部分制作的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

A URL 实际上只是一个字符串,任何常用的字符串操作技术都可以在这里使用。您的组成部分中也没有任何需要 URL-编码的字符,从而使整个过程更简单。

如果您确实有使用不在 list of unreserved characters, then use the urllib.parse.quote() function 中的字符的组件,将这些字符转换为 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])

或者您可以使用 formatted string literal:

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

这种方法的优点是组件不必是字符串;如果 outbound_routeinbound_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)