在Go中转换相对于绝对URL

时间:2018-12-09 12:32:22

标签: url go relative-url

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

2 个答案:

答案 0 :(得分:5)

是的,标准库可以使用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,然后就可以反复使用它。

答案 1 :(得分:2)

在@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 上试试。