如何使用HtmlAgilityPack提取完整的URL - C#

时间:2011-10-13 20:52:51

标签: c# hyperlink html-agility-pack extraction

好的,下面的方法只提取像这样的引用网址

提取代码:

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

2 个答案:

答案 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)
);