HtmlAgilityPack是一款将HTML转换为XML,再通过XPATH来实现网页抓取的动态链接库。
在解析DOM前先需要加载HTML的网页,可以用HtmlDocument类,此类封装了该方法。就拿博客园首页的各个文章的抓取为例,简单的加载为:
WebClient wc = new WebClient(); using (MemoryStream ms = new MemoryStream(wc.DownloadData(@"http://www.cnblogs.com"))) { HtmlDocument doc = new HtmlDocument(); doc.Load(ms, Encoding.UTF8);}
当把HTML加载进来以后,然后就可以解析HTML,此处用到了一个HtmlNode类,比较重要的有Attributes属性,例如<div class="diggit" onclick="DiggIt()">***</div>此处的class和onclick就是Attributes属性,可以在网页上面取到每个标题链接的URL。还有许多属性如FirstChild,LastChild,ChildNodes,ParentNode,都能够帮助找到你所需要的结果。同时,SelectSingleNode和SelectNodes对于找到所需要的内容也是有很大的帮助的。(SelectSingleNode:选择匹配 XPath 表达式的第一个XmlNode SelectNodes:选择匹配 XPath 表达式的结点集合 XmlNodeList)。最后依靠InnerHtml和InnerText来输出想要得到的结果。
同样拿博客园首页为例:
//获得所有博客总框架的ID节点 var main = doc.GetElementbyId("post_list"); //获得每一条博客的节点集合 var div = main.SelectNodes(".//a[@class='titlelnk' ]"); foreach (var each in div) { //每条BLOG的标题名称 Console.WriteLine(each.InnerText.Trim()); //每条BLOG的URL Console.WriteLine(each.Attributes[1].Value); }
这样就取到了标题以及链接。
总结:这个简单的例子只是用到了最基础的功能。还可以查看查看Html Agility文档去领会学习其中更高级的用法。