1

我正在编写某种页面抓取工具,我想做的一件事是将当前 url 与从当前页面提取的 url 片段结合起来。

像这样:

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

Easy peasy - 这种方法大部分时间都适用于相对和绝对 Uris。

但是,有些页面看起来像http://example.com/couple/of/folders/,带有 url 片段couple/of/otherfolders/。并且每个浏览器都将其解释为http://example.com/couple/of/otherfolders

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

现在,我一直在寻找解决这个问题的方法,但我只找到了不知道如何组合两个 url 的人,所以这并没有让我走得太远。我发现的最接近的问题是:如何像浏览器一样在 Java 中组合 URL 片段?,但答案并没有解决我的特定问题。

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


编辑 - 这是 IsAbsolute 方法(我知道我应该用 new Uri(link).IsAbsoluteUri 替换它):

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

1 回答 1

3

通常,浏览器不会这样做。但是当有一个<base>元素时,href会替换当前页面的 URL 以实现页面的 URL 解析目的

检查 a<base>并使用它来代替currentUrl它是否存在。

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

于 2013-06-29T14:21:51.597 回答