在python中动态生成URL

时间:2019-02-21 12:09:42

标签: python url urllib

我想以编程方式生成由这些部分组成的URL

固定部分

datatable

出站路由号码-更改

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

但不知道如何动态生成固定URL 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) 之后的第一部分

1 个答案:

答案 0 :(得分:2)

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

如果您的某些组成部分确实使用了list of unreserved characters中没有的字符,请使用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}"

在所有情况下,您最终都会在requests中使用最终网址:

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