Конвертировать относительно абсолютных 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

Я также использую его для своего краулера, и он работает как шарм!

Другие вопросы по тегам