通过HtmlAgilityPack+XPath来优化网页采集

上礼拜我在博客园发布了一篇关于网页数据分析和采集的文章,后来看过文章评论才知道原来现在已经有HtmlAgilityPack这个类库可以更方便地对HTML内容进行分析和提取。因此今天特别学习和实践了一下HtmlAgilityPack和XPath,并作下笔记。

 

1.下载HtmlAgilityPack.dll并将其添加引用到项目中,然后在代码中声明引用。

下载地址:http://www.codeplex.com/htmlagilitypack

引用:

using HtmlAgilityPack;

 

2.下载获取HTML页面的步骤和我上篇文章里介绍的差不多,都是先用WebClient或者WebRequest类来下载HTML页面然后处理成字符串。

 

3.与上次不同的是,这里分析和抓取HTML节点中的数据不再是之前那种STRING字符串操作的方式,而是封装成一个HtmlDocument对象,通过HtmlDocument中的方法来索引你需要抓取HTML节点,进而取出节点中的值。

 

4.若需要抓取的节点有ID,类似“<div id='post_list'>value</div>”这种,那很简单只需调用GetElementbyId方法根据节点ID即可获取所需节点。从而通过HtmlNode中的InnerText或Attribute属性来获取你想要的值。

CODE:

复制代码
//实例化HtmlAgilityPack.HtmlDocument对象HtmlDocument doc =new HtmlDocument(); //载入HTMLdoc.LoadHtml(mainData);
//根据HTML节点NODE的ID获取节点HtmlNode navNode = doc.GetElementbyId("post_list");
复制代码

 

5.但很多情况下HTML节点是没有ID的,那就需要通过XPATH语言来查找匹配所需节点(XPath教程)。以抓取博客园首页文章为例,通过查看博客园HTML可以发现博客园首页里的文章列表都是放在一个ID为"post_list"的"<div>"节点中的。

这样的话就可以通过调用GetElementbyId方法来定位到这个节点了。

 

6.在获取到"post_list"节点后,接下来就可以调用SelectSingleNode方法通过XPATH表达式来索引出需要抓取的节点,从而抓取到文章的标题和链接地址。

(PS:在博客园首页"post_list"节点里,平均每4个DIV就是一篇新的文章可以利用这一规律遍历出首页所有文章)

CODE:

复制代码
//实例化HtmlAgilityPack.HtmlDocument对象HtmlDocument doc =new HtmlDocument(); //载入HTMLdoc.LoadHtml(mainData);
//根据HTML节点NODE的ID获取节点HtmlNode navNode = doc.GetElementbyId("post_list"); //根据XPATH来索引节点
//div[2]表示文章链接a位于post_list里面第3个div节点中HtmlNode navNode2 = navNode.SelectSingleNode("//div[2]/h3/a"); //获取文章链接地址string articleTitle = navNode2.Attributes["href"].Value.ToString(); //获取文章标题string articleName = navNode2.InnerText;
复制代码

对比一下之前使用string截取字符串的方法:

复制代码
//以"<a class=\"titlelnk\" href=\""作为抓取点开始采集mainData=mainData.Substring(mainData.IndexOf("<a class=\"titlelnk\" href=\"") +26);
//获取文章页面的链接地址string articleAddr = mainData.Substring(0,mainData.IndexOf("\""));
//获取文章标题string articleTitle = mainData.Substring(mainData.IndexOf("target=\"_blank\">") +16,                                                mainData.IndexOf("</a>") - mainData.IndexOf("target=\"_blank\">") -16);
复制代码

可见与之前相比,使用HtmlAgilityPack.HtmlDocument类来实现前台HTML的分析和采集在页面编码和数据分析上面处理更加合理、优化,代码也更加简洁。

 

来源:http://www.cnblogs.com/youuuu/archive/2011/06/20/2085333.html

posted @ 2013-04-06 15:34  冰封的心  阅读(249)  评论(0)    收藏  举报