我正在用 C# 构建一个网络抓取工具,并通过执行以下操作获取页面上的所有链接:
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
}
这是在 Internet 上运行的,因此链接可能格式不正确,甚至可能是不同的协议。将 /gohere/index.html 或 potato.php 等内部链接转换为也包含网站 URL 的外部链接的最佳方法是什么?
我正在用 C# 构建一个网络抓取工具,并通过执行以下操作获取页面上的所有链接:
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
}
这是在 Internet 上运行的,因此链接可能格式不正确,甚至可能是不同的协议。将 /gohere/index.html 或 potato.php 等内部链接转换为也包含网站 URL 的外部链接的最佳方法是什么?
这可以很容易地完成,您可以使用用于获取页面的 Uri 构造一个新的 Uri。
像这样:
Uri baseUri = new Uri("http://www.contoso.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm");
Console.WriteLine(myUri.ToString());
更多信息:http: //msdn.microsoft.com/en-us/library/9hst1w91.aspx
这适用于相对和绝对 href 的相似之处,因此无需检查,您只需“转换”在此类页面上找到的每个链接。
我在这里对“这是在互联网上运行”部分感到困惑。您是先下载网页然后再抓取它吗?另外,如果语言不依赖,我建议使用 jSoup。它将回答您的大部分问题。
尽管尖叫的答案是正确的,但我更喜欢简单的方法:
List<string> links = new List<string>();
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
links.Add("http://mywebsite.com"+link.InnerText);
}