在 Go 中转换相对于绝对 URL

Convert relative to absolute URLs in Go

我正在编写一个小型网络爬虫,我正在爬网的网站上的很多链接都是相关的(例如,它们是 /robots.txt)。如何将这些相对 URL 转换为绝对 URL(因此 /robots.txt => http://google.com/robots.txt)? Go 是否有内置的方法来执行此操作?

是的,标准库可以用 net/url 包做到这一点。示例(来自标准库):

package main

import (
    "fmt"
    "log"
    "net/url"
)

func main() {
    u, err := url.Parse("../../..//search?q=dotnet")
    if err != nil {
        log.Fatal(err)
    }
    base, err := url.Parse("http://example.com/directory/")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(base.ResolveReference(u))
}

请注意,您只需要解析绝对 URL 一次,然后您就可以一遍又一遍地重复使用它。

在@Not_a_Golfer的解决方案之上。

您还可以使用 base URL 的 Parse 方法来提供相对或绝对 URL.

package main

import (
    "fmt"
    "log"
    "net/url"
)

func main() {
    // parse only base url
    base, err := url.Parse("http://example.com/directory/")
    if err != nil {
        log.Fatal(err)
    }

    // and then use it to parse relative URLs
    u, err := base.Parse("../../..//search?q=dotnet")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(u.String())
}

Go Playground 上试用。