C#之HTML解析利器HtmlAgilityPack类库

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();
// 载入HTML
doc.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();
// 载入HTML
doc.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的分析和采集在页面编码和数据分析上面处理更加合理、优化,代码也更加简洁。

 

目前只是粗浅地学了一下HtmlAgilityPack提取HTML节点数值的应用,更多应用以及采集速度的优化处理等方面尚未仔细研究,还望高人指点。

转载:http://mqth.blog.sohu.com/203260724.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值