Python:加入多个组件构建一个 URL

标签 python url-parsing

我正在尝试通过加入一些动态组件来构建 URL。我想使用类似 os.path.join() 的东西但是在我的情况下,对于 URL。从研究中我发现 urlparse.urljoin()做同样的事情。但是,看起来一次只需要两个参数。

到目前为止,我有以下工作但看起来重复:

    a = urlparse.urljoin(environment, schedule_uri)
    b = urlparse.urljoin(a, str(events_to_hours))
    c = urlparse.urljoin(b, str(events_from_date))
    d = urlparse.urljoin(c, str(api_version))
    e = urlparse.urljoin(d, str(id))
    url = e + '.json'

输出 = http://example.com/schedule/12/20160322/v1/1.json
以上工作,我试图通过这种方式缩短它:
url_join_items = [environment, schedule_uri, str(events_to_hours),
                  str(events_from_date), str(api_version), str(id), ".json"]
new_url = ""
for url_items in url_join_items:
    new_url = urlparse.urljoin(new_url, url_items)

输出:http://example.com/schedule/.json
但是第二个实现不起作用。请建议我如何解决这个问题或更好的方法。

编辑 1:reduce 的输出解决方案看起来像这样(不幸的是):
输出:http://example.com/schedule/.json

最佳答案

使用连接

你试过简单"/".join(url_join_items) . http 不是总是使用正斜杠吗?不过,您可能必须手动设置前缀“https://”和后缀。

就像是:

url = "https://{}.json".format("/".join(url_join_items))

使用 reduce 和 urljoin

这是一个 related question在 SO 上,这在一定程度上解释了实现 urljoin 背后的想法。 .您的用例似乎不是最合适的。

使用时 reduceurljoin ,我不确定它会做问题的意图,这在语义上类似于 os.path.join ,但对于网址。考虑以下:
from urllib.parse import urljoin
from functools import reduce

parts_1 = ["a","b","c","d"]
parts_2 = ["https://","server.com","somedir","somefile.json"]
parts_3 = ["https://","server.com/","somedir/","somefile.json"]

out1 = reduce(urljoin, parts_1)
print(out1)

d


out2 = reduce(urljoin, parts_2)
print(out2)

https:///somefile.json


out3 = reduce(urljoin, parts_3)
print(out3)

https:///server.com/somedir/somefile.json



请注意,除了 https 前缀后额外的“/”之外,第三个输出可能最接近提问者的意图,除非我们必须完成使用分隔符格式化各部分的所有工作。

关于Python:加入多个组件构建一个 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36189261/

相关文章:

python - 在 Python 中手动克隆/复制实例

url - 使用 net/url 内置包解析带有矩阵参数的 URL

javascript - 如何使用 javascript 从域中删除子域

python - 如何使用 `urlparse` 检查 URL 是否有效?

python - 在终端上运行 Python 脚本,然后继续使用终端

python - 如何在 Jupyter Notebook 中使用 ipywidgets 循环创建图形选项卡?

python - django-post_office - 使用基于文件而不是基于数据库的电子邮件模板

python - 区分Python中的文件和目录

sql - 在 Postgres 中解析 URL