使用Python的urljoin无法获取正确绝对路径的问题求助
解决urljoin返回不符合预期路径的问题
我明白你的困扰——urljoin的行为有时候和我们直觉里的相对路径拼接不一样,尤其是当第二个路径以/开头的时候。
为什么会出现这个问题?
urllib.parse.urljoin(我猜你用的是这个工具)的规则是:如果第二个参数是以/开头的绝对路径,它会把这个路径当成相对于URL根目录的路径,直接忽略基路径里的子目录部分。
你的基路径build/en/index.html是一个相对路径(没有协议/域名/根标识),所以urljoin会把/pub-assets/css/indexen.css当成根路径,最终返回/pub-assets/css/indexen.css,这和你想要的build/pub-assets/css/indexen.css完全不符。
解决办法
根据你的预期结果,/pub-assets应该是相对于build目录的路径,所以我们需要调整拼接逻辑:
方法1:用文件系统路径工具拼接(适合本地文件路径)
如果这是处理本地文件路径,推荐用os.path模块,它更贴合文件系统的路径逻辑:
import os url1 = 'build/en/index.html' url2 = '/pub-assets/css/indexen.css' # 先获取url1的父目录的父目录(也就是build/) base_dir = os.path.dirname(os.path.dirname(url1)) # 去掉url2开头的/,再拼接 result = os.path.join(base_dir, url2.lstrip('/')) print(result) # 输出: build/pub-assets/css/indexen.css
方法2:调整url2为相对路径后用urljoin(如果url2实际是相对于url1的上一级目录)
如果pub-assets是和en同级的目录,你可以把url2改成相对路径(去掉开头的/,改成上一级目录的相对写法),然后用urljoin处理:
from urllib.parse import urljoin url1 = 'build/en/index.html' url2 = '../pub-assets/css/indexen.css' # 修改为相对路径 result = urljoin(url1, url2) print(result) # 输出: build/pub-assets/css/indexen.css
方法3:手动拆分基路径后拼接(适合URL路径场景)
如果这是处理Web URL路径,你可以拆分基路径的根部分,再拼接:
from urllib.parse import urlparse url1 = 'build/en/index.html' url2 = '/pub-assets/css/indexen.css' # 拆分基路径 parsed = urlparse(url1) # 提取基路径的根目录(这里是build/) base_root = parsed.path.split('/')[0] # 拼接路径 result = f"{base_root}{url2}" print(result) # 输出: build/pub-assets/css/indexen.css
总结
urljoin是为URL设计的工具,它的路径规则遵循Web URL的逻辑,而不是本地文件系统的相对路径逻辑。如果你的场景是本地文件路径,优先用os.path模块;如果是URL路径,需要根据实际的层级关系调整第二个参数的格式,或者手动拆分拼接。
内容的提问来源于stack exchange,提问作者Milix
相关产品推荐
相关产品推荐

