Python 使用urllib连接两个URL组件时出现问题
最近我想做一个Python程序,它可以抓取一个网站。我想使用urllib.parse.urljoin将这两个组件连接起来,这两个组件将提供以下输出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
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)