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

时间:2016-03-12 20:34:37

标签: http parsing url go absolute-path

我已经构建了一个网络抓取工具,可以在网站上搜索该网页上的所有链接并获取此链接并在其上搜索更多链接,直到整个网页被抓取为止。工作得很好,直到我遇到一个特殊的网站。

他们的链接问题:

正常情况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,因为绝对URL的测试是u.IsAbs()= false如果http://缺失...

任何想法如何解决?我必须在每日基础上测试100.000 - 1.000.000个链接,可能更多,并且它需要具有高性能。

1 个答案:

答案 0 :(得分:1)

不幸的是,没有真正的"修复"为此,因为如果你得到一个像这样的href的链接:

www.example.com

在一般情况下,它之间的含糊不清:

http://host.tld/path/to/www.example.com
http://www.example.com

事实上,大多数浏览器会对这样的链接进行处理:

<a href="www.example.com">

这样:

<a href="/current/path/www.example.com">

我建议做同样的事情(因为这是个人网站的错误),如果你得到404就像对待任何其他人一样对待它。