当前位置:首页 >.NET > 正文内容

通过HtmlAgilityPack+XPath来优化网页采集学习笔记

大滑稽11年前 (2014-03-24).NET1238

 

上礼拜我在博客园发布了一篇关于网页数据分析和采集的文章,后来看过文章评论才知道原来现在已经有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,类似“value”这种,那很简单只需调用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"的""节点中的。 这样的话就可以通过调用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截取字符串的方法: //以"") + 16, mainData.IndexOf("") - mainData.IndexOf("target=\"_blank\">") - 16);

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

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

 

扫描二维码推送至手机访问。

版权声明:本文由第★一★次发布,如需转载请注明出处。

本文链接:https://wpers.net/post/48.html

“通过HtmlAgilityPack+XPath来优化网页采集学习笔记” 的相关文章

Cbo控件数据源绑定

 //Cbo控件数据源绑定DataTable DtType = noteType.GetTypeList("");         ...

C#遍历控件的方法

首先,要想遍历,就必须找到你想找的表单里面的所有控件,然后一个个的逐一比对,当找到了你需要的控件的时候,再做你需要的操作。1、foreach方法foreach (Control control in ...

Linq读写XML

         private List<News> GetNews(string html)    &n...

修改注册表限制软件使用次数

 private void Form1_Load(object sender, System.EventArgs e){RegistryKey RootKey,RegKey; //项名为:HKEY_CURRENT_USER\So...

c#中分页显示数据

     //c#中分页显示数据    public partial class Form1 : Form    {  ...

C#获得程序集

 //获得程序集System.Reflection.Assembly assem = System.Reflection.Assembly.GetExecutingAssembly();...