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

C# 如何使用HtmlAgilityPack-C提取完整url#,c#,hyperlink,html-agility-pack,extraction,C#,Hyperlink,Html Agility Pack,Extraction,好的,下面的方法是提取像这样的引用url 提取代码: foreach (HtmlNode link in hdDoc.DocumentNode.SelectNodes("//a[@href]")) { lsLinks.Add(link.Attributes["href"].Value.ToString()); } url代码 <a href="Login.aspx">Login</a> 但我想得到浏览器解析后的真实链接 http://www.monstermm

好的,下面的方法是提取像这样的引用url

提取代码:

foreach (HtmlNode link in hdDoc.DocumentNode.SelectNodes("//a[@href]"))
{
    lsLinks.Add(link.Attributes["href"].Value.ToString());
}
url代码

<a href="Login.aspx">Login</a>
但我想得到浏览器解析后的真实链接

http://www.monstermmorpg.com/Login.aspx
我可以通过检查url是否包含http来完成,如果不包含,则添加域值,但在某些情况下可能会导致一些问题,我认为这不是一个非常明智的解决方案

c#4.0,HtmlAgilityPack.1.4.0

我可以检查url是否包含http,如果不包含,则添加域值

这就是你应该做的。Html Agility Pack在这方面没有任何帮助:

var url = new Uri(
    new Uri(baseUrl).GetLeftPart(UriPartial.Path), 
    link.Attributes["href"].Value)
); 

假设您拥有原始url,您可以将解析后的url组合为以下内容:

// 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
解码URL(使其更“人类可读”),这不是你通常想要的。

但是如果让我们假设爬网的url是:那么在这个问题中,我怎么才能得到真正的url?相对/根路径呢?如果有一个
base
元素怎么办?@MonsterMMORPG它仍然有效-我已经用另一个元素更新了答案example@Oded关于
标记的观点很好,您还需要考虑这些标记。谢谢你的更新。所以这个baseurl是爬网url,对吗?还有一些链接包含非英语字符,我如何解决这个问题。我认为这是编码问题。谢谢,但让我们假设爬网的url是:-在这种情况下,我如何获取?@MonsterMMORPG,您可以使用
var url=new Uri(new Uri(baseUrl).GetLeftPart(UriPartial.Path),link.Attributes[“href”].Value))。您的语法不正确,现在可以解决此问题。因此,它不工作,并给出错误。此外,基本URL是指在解析文档中存在“<代码>基< /COD>元素”,以及路径是否是相对的、绝对的或外部的,需要考虑URL的爬行页URL。
// 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)'