Конвертировать относительно абсолютных URL в Go
Я пишу небольшой веб-сканер, и многие ссылки на сайтах, которые я сканирую, являются относительными (поэтому они /robots.txt
, например). Как преобразовать эти относительные URL-адреса в абсолютные (так /robots.txt
=> http://google.com/robots.txt
)? Есть ли у Go встроенный способ сделать это?
3 ответа
Да, стандартная библиотека может сделать это с 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
Я также использую его для своего краулера, и он работает как шарм!