猿问

如果缺少 http://,则使用 url.ResolveReference() 解析错误的 URL

我已经构建了一个网络爬虫,它会在网站上搜索该页面上的所有链接,然后获取这些链接并在它们上搜索更多链接,直到整个页面被爬取为止。工作完美,直到我遇到一个特殊的网站。


他们的链接问题:


正常情况 1:绝对路径,如“ http://www.example.com/test ”


正常情况 2:相对路径,如 '/test'


有问题的新案例:没有 http:// 的绝对路径 - 只是“www.example.com”


显示问题的示例代码:


package main


import (

    "fmt"

    "log"

    "net/url"

)


func main() {


    u, err := url.Parse("http://www.example.com")

    if err != nil {

        log.Fatal(err)

    }

    base, err := url.Parse("http://example.com/directory/")

        if err != nil {

            log.Fatal(err)

        }


    u2, err := url.Parse("www.example.com")

    if err != nil {

        log.Fatal(err)

    }

    base2, err := url.Parse("http://example.com/directory/")

        if err != nil {

            log.Fatal(err)

        }


    fmt.Println(base.ResolveReference(u))

    fmt.Println(base2.ResolveReference(u2))

}


http://www.example.com

http://example.com/test/www.example.com

正如您所看到的,第二行返回了错误的 URL,因为如果 http:// 丢失,则绝对 URL 的测试为 u.IsAbs() = false ...


任何想法如何解决这个问题?我必须每天测试 100.000 - 1.000.000 个链接,也许更多,并且需要高性能。


慕丝7291255
浏览 175回答 1
1回答

慕婉清6462132

不幸的是,这并没有真正的“修复”,因为如果你得到一个带有这样的 href 的链接:www.example.com在一般情况下,它是模棱两可的:http://host.tld/path/to/www.example.com&nbsp; http://www.example.com事实上,大多数浏览器是这样处理链接的:<a&nbsp;href="www.example.com">像这样:<a&nbsp;href="/current/path/www.example.com">我建议也这样做(因为这是该人网站的错误),如果您收到 404,请像对待其他任何人一样对待它。
随时随地看视频慕课网APP

相关分类

Go
我要回答