xpath一般使用在xml的解析上比较多,实际上html是xml的一个子集。在.Net中为了方便我们对html进行操作微软为我们提供了一个轻量级并且开源的类库HtmlAgilityPack(点击下载)。比如我们想截取网页上某一部分文字获取其他元素的时候我们一般都是使用正则表达式一步一步的来进行处理的,这个过程相当的繁琐特别是对正则表达式不熟悉的情况,通过HtmlAgilityPack这个过程就变得相当简单了。下面我们来看下HtmlAgilityPack的基本使用方法。
在使用HtmlAgilityPack之前第一步当然是下载了,下载完成解压出来之后我们可以看到几个文件夹,如下图:

基本上支持.Net所有的平台啦,大家可以根据自己的需求来进行选择。在项目中添加引用就可以了。下面我们来看几个例子来熟悉一下HtmlAgilityPack的使用。
Demo 1:获取http://www.studycsharp.com 首页的所有板块的链接?
首先我们必须知道其中一个板块的xpath,然后我们在进行分析,怎么获取页面的xpath?在google浏览器或者火狐浏览器中有一个很好用的插件,当我们选中某一元素时点击右键会出来一个“审查元素的”选项如下图:

点击"审查元素"之后的页面

接下来我们点击Copy Xpath这个选项这个元素的Xpath就被复制到剪贴板了,下面我们截取两个板块的Xpath来进行分析,如下:
"C#常用工具类"的Xpath: //*[@id="category_63"]/table/tbody/tr[2]/td[2]/dl/dt/a
"C#PDF书籍"的xpath: //*[@id="category_1"]/table/tbody/tr/td[2]/dl/dt/a
分析出来的结果:ID是一个变量每个板块的ID都不一样,但是也有通性他们都是以"category_"开头的。tr[2] td[2]中的数字是不固定的。
分析出来结果后就可以对Xpath进行构造了,最终构造出来的Xpath为://*[starts-with(@id,'category_')]/table/tr/td/dl/dt/a,tbody这个元素被我去掉了因为我发现加上tbody这个标签后居然没办法解析,[starts-with(@id,'category_')]这一句的意思是获取html根元素下所有ID以category_开头的子元素,tr[2]td[2]中的数字被我换成了*因为tr td的位置是不固定的所以选择了通配符*。
说了这么多看下代码吧:
[C#] 纯文本查看 复制代码?
0102030405060708091011121314151617 //第一步声明HtmlAgilityPack.HtmlDocument实例 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); //获取Html页面代码 string html = HTMLHelper.Get_Http("http://www.studycsharp.com/"); //第二步加载html文档 doc.LoadHtml(html); //第三步通过Xpath选中html的指定元素 这样子就获取到了[url=http://www.studycsharp.com]http://www.studycsharp.com[/url]的"常用工具类"的板块链接了 HtmlAgilityPack.HtmlNode htmlnode = doc.DocumentNode.SelectSingleNode("//*[@id=\"category_63\"]/table/tr[2]/td[2]/dl/dt/a"); //获取所有板块的a标签 HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//*[starts-with(@id,'category_')]/table/tr/td/dl/dt/a"); StringBuilder sb = new StringBuilder(); foreach (HtmlAgilityPack.HtmlNode item in collection) { sb.Append(string.Format("{0}:{1}\r\n", item.InnerText, item.Attributes["href"].Value)); } this.textBox1.Text = sb.ToString();
效果图如下:

在使用HtmlAgilityPack之前第一步当然是下载了,下载完成解压出来之后我们可以看到几个文件夹,如下图:

基本上支持.Net所有的平台啦,大家可以根据自己的需求来进行选择。在项目中添加引用就可以了。下面我们来看几个例子来熟悉一下HtmlAgilityPack的使用。
Demo 1:获取http://www.studycsharp.com 首页的所有板块的链接?
首先我们必须知道其中一个板块的xpath,然后我们在进行分析,怎么获取页面的xpath?在google浏览器或者火狐浏览器中有一个很好用的插件,当我们选中某一元素时点击右键会出来一个“审查元素的”选项如下图:

点击"审查元素"之后的页面

接下来我们点击Copy Xpath这个选项这个元素的Xpath就被复制到剪贴板了,下面我们截取两个板块的Xpath来进行分析,如下:
"C#常用工具类"的Xpath: //*[@id="category_63"]/table/tbody/tr[2]/td[2]/dl/dt/a
"C#PDF书籍"的xpath: //*[@id="category_1"]/table/tbody/tr/td[2]/dl/dt/a
分析出来的结果:ID是一个变量每个板块的ID都不一样,但是也有通性他们都是以"category_"开头的。tr[2] td[2]中的数字是不固定的。
分析出来结果后就可以对Xpath进行构造了,最终构造出来的Xpath为://*[starts-with(@id,'category_')]/table/tr/td/dl/dt/a,tbody这个元素被我去掉了因为我发现加上tbody这个标签后居然没办法解析,[starts-with(@id,'category_')]这一句的意思是获取html根元素下所有ID以category_开头的子元素,tr[2]td[2]中的数字被我换成了*因为tr td的位置是不固定的所以选择了通配符*。
说了这么多看下代码吧:
[C#] 纯文本查看 复制代码?
0102030405060708091011121314151617 //第一步声明HtmlAgilityPack.HtmlDocument实例 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); //获取Html页面代码 string html = HTMLHelper.Get_Http("http://www.studycsharp.com/"); //第二步加载html文档 doc.LoadHtml(html); //第三步通过Xpath选中html的指定元素 这样子就获取到了[url=http://www.studycsharp.com]http://www.studycsharp.com[/url]的"常用工具类"的板块链接了 HtmlAgilityPack.HtmlNode htmlnode = doc.DocumentNode.SelectSingleNode("//*[@id=\"category_63\"]/table/tr[2]/td[2]/dl/dt/a"); //获取所有板块的a标签 HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//*[starts-with(@id,'category_')]/table/tr/td/dl/dt/a"); StringBuilder sb = new StringBuilder(); foreach (HtmlAgilityPack.HtmlNode item in collection) { sb.Append(string.Format("{0}:{1}\r\n", item.InnerText, item.Attributes["href"].Value)); } this.textBox1.Text = sb.ToString();
效果图如下:



三台