最近在学习HtmlAgilityPack,发现它的类库函数是非常的强大的,对于实现网页数据的抓取是非常的方便的。下面是一个运用HtmlAgilityPack抓取数据的简单例子,目标是抓取我的个人博客的文章列表数据,路径如下:adamlevine7的个人博文目录
核心代码如下:
1.先引用HtmlAgilityPack.dll;
2.编写函数:
private void start_Click(object sender, EventArgs e)
{
WebClient wb = new WebClient();
wb.Encoding = Encoding.UTF8;
string returnHtml = wb.DownloadString("http://blog.youkuaiyun.com/adamlevine7?viewmode=contents");<span style="color:#330099;">//第一步下载页面源码</span>
if (returnHtml != "")
{
richTextBox1.Text += "-------开始抓取数据-------\r\n";
//实例化HtmlAgilityPack.HtmlDocument对象
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
//载入HTML
doc.LoadHtml(returnHtml);//第二步将源码载入到HtmlDocument对象中
//根据HTML节点NODE的ID获取节点
HtmlNode articleNode = doc.GetElementbyId("article_list");//第三步寻找起始节点
//根据 XPATH路径表达式 来索引节点
HtmlNodeCollection titleList = articleNode.SelectNodes("//span[@class='link_title']/a"); //获取含有文章标题的a标签
HtmlNodeCollection timeList = articleNode.SelectNodes("//span[@class='link_postdate']"); //获取含有发布时间的span标签
HtmlNodeCollection viewList = articleNode.SelectNodes("//span[@class='link_view']"); //获取含有阅读次数的span标签
HtmlNodeCollection commentsList = articleNode.SelectNodes("//span[@class='link_comments']"); //获取含有评论次数的span标签
BaseArticle ba = new BaseArticle();
for (int i = 0; i < titleList.Count; i++)
{
//第四步截取所需内容
ba.title = titleList[i].InnerText.Trim();
ba.blogUrl = blog + titleList[i].Attributes["href"].Value.ToString().Trim();
ba.postDate = timeList[i].InnerText.Trim();
ba.viewTimes = Convert.ToInt32(viewList[i].InnerText.Replace("阅读(", "").Replace(")", "").Trim());
ba.commentTimes = Convert.ToInt32(commentsList[i].InnerText.Replace("评论(", "").Replace(")", "").Trim());
//第五步显示数据,或将数据存入数据库
richTextBox1.Text += "标题:" + ba.title + "\r\n";//输出到ui显示
richTextBox1.Text += "详情页面地址:" + ba.blogUrl + "\r\n";
richTextBox1.Text += "发布日期:" + ba.postDate + "\r\n";
richTextBox1.Text += "阅读次数:" + ba.viewTimes + "\r\n";
richTextBox1.Text += "评论次数:" + ba.commentTimes + "\r\n";
}
richTextBox1.Text += "-------结束-------\r\n";
}
}
3.运行截图:
看了上面的例子,是不是觉得很简单?!没错,HtmlAgilityPack就是这么牛逼!它是一个开源的.net组件,
官方地址:http://htmlagilitypack.codeplex.com/
当然也有跟HtmlAgilityPack类似的处理html的组件类库,如AngleSharp、CsQuery等,关于这三者的讨论你在Google上随便一搜就有,至于哪个好哪个更实用,这就要看实际需求了,个人建议选择 HtmlAgilityPack,因为它轻量级、速度快,国外有人做过相关的测试结果如下:
https://github.com/FlorianRappl/AngleSharp/wiki/Performance
所以,请根据实际情况选择吧,反正三者都有各有优点。
关于HtmlAgilityPack类库的常用属性和函数说明,我在博客园找到了一篇比较全的文章,分享给大家,很实用: