Python中如何将提取内容里的链接相对路径转换为绝对路径?

提取的字符串里有好多链接,都是相对路径,如何把这些都改成绝对路径? 比如:改成 实际上就是修改 href 的内容,先提取出 href ,再用 urljoin 转换成绝对路径,但是怎么找每个链接的 href 的位置呢?


Python中如何将提取内容里的链接相对路径转换为绝对路径?

11 回复

上面发贴失误,是这样的:
提取的字符串里有好多链接,都是相对路径,如何把这些都改成绝对路径?
比如: href="about.html"改成 href="http://www.abc.com/about.html"
实际上就是修改 href 的内容,先提取出 href ,再用 urljoin 转换成绝对路径,但是怎么找每个链接的 href 的位置呢?


from urllib.parse import urljoin, urlparse

def relative_to_absolute(base_url, relative_path):
    """
    将相对路径转换为绝对路径
    
    Args:
        base_url: 基础URL(页面地址)
        relative_path: 相对路径或URL
    
    Returns:
        绝对URL字符串
    """
    # 如果已经是绝对路径,直接返回
    if bool(urlparse(relative_path).netloc):
        return relative_path
    
    # 使用urljoin进行转换
    absolute_url = urljoin(base_url, relative_path)
    return absolute_url

# 使用示例
if __name__ == "__main__":
    # 示例1: 基础情况
    base = "https://example.com/blog/article.html"
    relative = "images/photo.jpg"
    result = relative_to_absolute(base, relative)
    print(f"示例1: {result}")
    # 输出: https://example.com/blog/images/photo.jpg
    
    # 示例2: 带..的路径
    base = "https://example.com/blog/article.html"
    relative = "../static/css/style.css"
    result = relative_to_absolute(base, relative)
    print(f"示例2: {result}")
    # 输出: https://example.com/static/css/style.css
    
    # 示例3: 根路径
    base = "https://example.com/blog/article.html"
    relative = "/api/data.json"
    result = relative_to_absolute(base, relative)
    print(f"示例3: {result}")
    # 输出: https://example.com/api/data.json
    
    # 示例4: 已经是绝对路径
    base = "https://example.com/blog/article.html"
    relative = "https://cdn.example.com/script.js"
    result = relative_to_absolute(base, relative)
    print(f"示例4: {result}")
    # 输出: https://cdn.example.com/script.js

这个方案的核心是使用Python标准库urllib.parse中的urljoin函数。它自动处理各种相对路径情况:

  • 普通相对路径:images/photo.jpg
  • 上级目录:../static/css/style.css
  • 根路径:/api/data.json
  • 协议相对路径://cdn.example.com/script.js

urljoin会自动根据基础URL解析相对路径,生成正确的绝对URL。函数中先检查是否已经是绝对路径(通过判断是否有网络位置),避免不必要的处理。

总结建议:用urljoin处理路径转换最可靠。

不需要找位置,知道当前页面的 URL(目录)就行了

http://www.abc.com/about.html
http://www.abc.com//about.html
http://www.abc.com/xxx//about.html
http://www.abc.com/xxx/xxx2/…/…/about.html
这些都会走到同一个页面的,不用担心

还有,记得 python 中计算相对路径和绝对路径的函数,对 URL 也适用,你找找

是我提问没说明白,我是想要改成绝对路径的字符串,比如我把别的网站一个页面取下来传到我的网站上,那这个页面上相对路径的 about.html 指向的是我的网站,我要的是指向他的网站的 about.html ,所以要把这里的相对路径改成绝对路径。

那你就改呗

bs4 , lxml 都可以

直接改吧?你是想让它自动变成绝对路径?

这个浏览器会自己改吧,不用你管。。

回到顶部