好的,下面的方法只提取像这样的引用网址
提取代码:
foreach (HtmlNode link in hdDoc.DocumentNode.SelectNodes("//a[@href]"))
{
lsLinks.Add(link.Attributes["href"].Value.ToString());
}
网址代码
<a href="Login.aspx">Login</a>
提取的网址
Login.aspx
但是我希望得到真正的链接,解析浏览器如
http://www.monstermmorpg.com/Login.aspx
我可以检查url是否包含http,如果没有添加域值,但在某些情况下可能会导致一些问题,我认为这不是一个非常明智的解决方案。
c#4.0,HtmlAgilityPack.1.4.0
答案 0 :(得分:15)
假设您有原始网址,您可以将解析后的网址组合如下:
// The address of the page you crawled
var baseUrl = new Uri("http://example.com/path/to-page/here.aspx");
// root relative
var url = new Uri(baseUrl, "/Login.aspx");
Console.WriteLine (url.AbsoluteUri); // prints 'http://example.com/Logon.aspx'
// relative
url = new Uri(baseUrl, "../foo.aspx?q=1");
Console.WriteLine (url.AbsoluteUri); // prints 'http://example.com/path/foo.aspx?q=1'
// absolute
url = new Uri(baseUrl, "http://stackoverflow.com/questions/7760286/");
Console.WriteLine (url.AbsoluteUri); // prints 'http://stackoverflow.com/questions/7760286/'
// other...
url = new Uri(baseUrl, "javascript:void(0)");
Console.WriteLine (url.AbsoluteUri); // prints 'javascript:void(0)'
请注意使用AbsoluteUri
而不依赖于ToString()
,因为ToString
解码了网址(使其更具“人类可读性”),这是不是强>通常你想要的。
答案 1 :(得分:2)
我可以通过检查url是否包含http以及是否添加域值
来执行此操作
这就是你应该做的。 Html Agility Pack对此没有任何帮助:
var url = new Uri(
new Uri(baseUrl).GetLeftPart(UriPartial.Path),
link.Attributes["href"].Value)
);