Python 使用urllib连接两个URL组件时出现问题

Python 使用urllib连接两个URL组件时出现问题,python,web,urllib,Python,Web,Urllib,最近我想做一个Python程序,它可以抓取一个网站。我想使用urllib.parse.urljoin将这两个组件连接起来,这两个组件将提供以下输出 https://test.com/endpoint + test.php = https://test.com/endpoint/test.php 我的代码: urllib.parse.urljoin('https://test.com/endpoint“,”test.php“ 但是,它显示了以下输出: https://test.com/test

最近我想做一个Python程序,它可以抓取一个网站。我想使用urllib.parse.urljoin将这两个组件连接起来,这两个组件将提供以下输出

https://test.com/endpoint + test.php =  https://test.com/endpoint/test.php
我的代码:

urllib.parse.urljoin('https://test.com/endpoint“,”test.php“

但是,它显示了以下输出:

https://test.com/test.php

有什么方法可以帮助我获得所需的输出吗?

这是因为
urllib.parse.urljoin
不是为这个用例设计的

文档()中的示例:

输出:

http://www.cwi.nl/%7Eguido/FAQ.html
如文档中所述,
urllib.parse.urljoin

通过将一个“基本URL”(基本URL)与另一个“基本URL”组合而成的完整(“绝对”)URL URL(URL)

在您的示例中,您给出了“https://test.com/endpoint“作为第一个参数,所以<代码> URLLIB .PARSE。URLJON/<代码>将考虑“基本URL”是“https://test.com/,它将添加您作为第二个参数传递的内容(即“test.php”),这就是为什么您的输出是https://test.com/test.php“

我认为您最好的选择是使用@tripleee发布的
joinurl
函数,因为它不会产生像“endpoint//test.php”或“endpointtest.php”这样的结果

但是如果您的代码必须是跨平台的,则不应使用
os.path.join
。在Windows上,您将获得反斜杠而不是斜杠(“https://test.com/endpoint\test.php”)

以下是用于测试目的的代码示例:

def joinurl(baseurl, path):
    return '/'.join([baseurl.rstrip('/'), path.lstrip('/')])

url_base = "https://test.com/endpoint"
web_page_name = "/test.php"

desired_output = "https://test.com/endpoint/test.php"

assert(joinurl("https://test.com/endpoint", "test.php") == desired_output)
assert(joinurl("https://test.com/endpoint/", "test.php") == desired_output)
assert(joinurl("https://test.com/endpoint", "/test.php") == desired_output)
assert(joinurl("https://test.com/endpoint/", "/test.php") == desired_output)

urljoin
的目的是替换基本URL中路径的最后一部分。如果这不是您想要的,可能使用不同的函数。在这里,常规的字符串连接可以很好地工作,可能需要一个规范化斜杠的条款

def joinurl(baseurl,路径):
返回“/”.join([baseurl.rstrip(“/”),path.lstrip(“/”)]))

这非常类似于
os.path.join
;也许可以考虑使用它。(当然,在Windows上,系统路径分隔符不是斜杠,它会对URL执行错误的操作。)

您如何“使用
urllib.parse.urljoin
”?是什么代码产生了这个输出?a=”“b=“test.php”urllib.parse.urljoin(a,b)这个用例的好解决方案。也许你也可以把它贴在这里:?我不认为它比现有的答案有什么意义。
def joinurl(baseurl, path):
    return '/'.join([baseurl.rstrip('/'), path.lstrip('/')])

url_base = "https://test.com/endpoint"
web_page_name = "/test.php"

desired_output = "https://test.com/endpoint/test.php"

assert(joinurl("https://test.com/endpoint", "test.php") == desired_output)
assert(joinurl("https://test.com/endpoint/", "test.php") == desired_output)
assert(joinurl("https://test.com/endpoint", "/test.php") == desired_output)
assert(joinurl("https://test.com/endpoint/", "/test.php") == desired_output)