Go中将相对URL转换为绝对URL

7

我正在编写一个小型网络爬虫,但是我发现在爬取的网站中有很多链接都是相对路径(例如 /robots.txt)。我该如何将这些相对路径转换为绝对路径(例如 /robots.txt => http://google.com/robots.txt)?Go语言是否有内置的方法可以实现这个功能?

3个回答

13

是的,标准库可以通过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。好主意。 - Svetoslav Marinov

6

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


1

我想你正在寻找 ResolveReference 方法

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))
}
// gives: http://example.com/search?q=dotnet

我也用它来做网络爬虫,效果非常好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接