我正在编写一个小型网络爬虫,但是我发现在爬取的网站中有很多链接都是相对路径(例如 /robots.txt
)。我该如何将这些相对路径转换为绝对路径(例如 /robots.txt
=> http://google.com/robots.txt
)?Go语言是否有内置的方法可以实现这个功能?
我正在编写一个小型网络爬虫,但是我发现在爬取的网站中有很多链接都是相对路径(例如 /robots.txt
)。我该如何将这些相对路径转换为绝对路径(例如 /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上试一下。
我想你正在寻找 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
我也用它来做网络爬虫,效果非常好!