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

8

以下是提取仅包含引荐URL的方法:

提取代码如下:

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

URL代码
<a href="Login.aspx">Login</a>

提取的URL
Login.aspx

但是我想获得浏览器解析的真正链接
http://www.monstermmorpg.com/Login.aspx

我可以通过检查URL是否包含http,如果不包含则添加域名值来完成此操作,但这可能会在某些情况下引起问题,我认为这不是一个明智的解决方案。

c# 4.0,HtmlAgilityPack.1.4.0


你需要考虑URL,如果解析文档中有一个“base”元素以及路径是相对的、绝对的还是外部的。 - Oded
2个回答

16
假设您有原始网址,您可以像这样组合解析后的网址:
// 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, "https://dev59.com/-1zUa4cB1Zd3GeqP0zR2");
Console.WriteLine (url.AbsoluteUri); // prints 'https://dev59.com/-1zUa4cB1Zd3GeqP0zR2'

// other...
url = new Uri(baseUrl, "javascript:void(0)");
Console.WriteLine (url.AbsoluteUri); // prints 'javascript:void(0)'

注意使用 AbsoluteUri 而不是依赖于 ToString(),因为 ToString() 会解码 URL(使其更易读),这通常不是你想要的。


1
相对路径/根路径怎么办?如果有“base”元素呢? - Oded
@MonsterMMORPG 这仍然有效 - 我已经更新了答案,并提供了另一个示例。 - Duncan Smart
@Oded 对于 <base href='...'> 标签的观点很好,你也需要考虑到这一点。 - Duncan Smart
你好。感谢更新。所以这个baseurl是被爬取的网址,对吗?还有一些链接包含非英文字符,我该如何解决这个问题呢?我认为这是编码问题。 - Furkan Gözükara
是的,绝对 URI 解决了编码问题。 唯一的问题是它将 JavaScript 作为链接获取。 我可以检查是否包含 http,但还有更有效的解决方案吗? - Furkan Gözükara
显示剩余5条评论

2

我可以通过检查URL是否包含http,如果不包含,则添加域值来完成它。

这就是你应该做的。Html Agility Pack无法帮助你解决这个问题:

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

谢谢,但是假设爬取的URL是:http://www.vatanbilgisayar.com/Ev%20Bak%C4%B1m%20%C3%9Cr%C3%BCn%C3%BC/kenwood-vc-6850-vc-6850-torbasiz-elektrikli-supurge/productdetails.aspx?I_ID=40410 - 在这种情况下,我该如何获取? - Furkan Gözükara
@MonsterMMORPG,你可以使用var url = new Uri(new Uri(baseUrl).GetLeftPart(UriPartial.Path), link.Attributes["href"].Value)); - Darin Dimitrov
你的语法不正确,可能无法解决问题。因此它不起作用并显示错误。另外,基本URL是指爬取页面的URL,对吗? - Furkan Gözükara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接