如何以与浏览器相同的方式组合两个网址?

时间:2013-06-29 14:12:24

标签: c# url browser

我正在编写某种页面抓取工具,而我要做的其中一件事就是将当前网址与从当前页面提取的网址片段相结合。

像这样:

if (WebPath.IsAbsolute(urlFragment))
    links.Add(new Uri(urlFragment));
else
    links.Add(new Uri(currentUrl, urlFragment));

容易愚蠢 - 这种方法大部分时间都适用于相对和绝对的Uris。

然而,有些网页看起来像http://example.com/couple/of/folders/,网址片段为couple/of/otherfolders/。每个浏览器都将其解释为http://example.com/couple/of/otherfolders

当然,我的代码会产生http://example.com/couple/of/folders/couple/of/otherfolders。从Uri的角度来看,这看起来是完全正确的 - 但我不知道浏览器如何能够解释这一点。

现在,我已经找到了解决这个问题的方法,但我只找到了不知道如何组合两个网址的人,所以这并没有让我走得太远。我发现最接近的问题是How do you combine URL fragments in Java the same way browsers do?,但答案并没有解决我的特殊问题。

有人知道我错过了什么吗?


编辑 - 这是IsAbsolute方法(我知道我应该用新的Uri替换它(链接).IsAbsoluteUri):

public static bool IsAbsolute(string path)
{
    var uppercasePath = path.ToUpper();
    return uppercasePath.StartsWith("HTTP://") || uppercasePath.StartsWith("HTTPS://");
}

1 个答案:

答案 0 :(得分:3)

通常情况下,浏览器不会这样做。但是当有<base>元素时,its href replaces the current page’s URL for the page’s URL-resolving purposes

检查<base>并使用它代替currentUrl(如果存在)。

另外,感谢提醒我修理所有刮刀!