HtmlAgilityPack是一个基于.Net的、第三方免费开源的微型类库,主要用于在服务器端解析html文档(在B/S结构的程序中客户端可以用Javascript解析html)。截止到本文发表时,HtmlAgilityPack的最新版本为1.4.0。下载地址:http://htmlagilitypack.codeplex.com/

下载后解压缩后有3个文件,这里只需要将其中的HtmlAgilityPack.dll(程序集)、HtmlAgilityPack.xml(文档,用于Visual Studio 2008中代码智能提示和帮助说明之用)引入解决方案中即可使用,无需安装任何东西,非常“绿色环保”。

在C#类文件开头引入using HtmlAgilityPack;就可以使用该命名空间下的类型了。实际使用中,几乎都是以HtmlDocument类为主线的,这一点非常类似于微软.net framework中的XmlDocument类。XmlDocument类是操作的是xml文档,而HtmlDocument类操作的是html文档(其实也可以操作xml文档),它们的操作方式都是基于Dom,所不同的是后者取消了诸如GetElementsByTagName这样的方法,强化了GetElementById方法(在HtmlDocument中可以直接使用,而XmlDocument则不可以)。HtmlAgilityPack中定位节点基本上都用Xpath表达式,Xpath表达式的参考文档可见:http://www.w3school.com.cn/xpath/xpath_syntax.asp

例如,我们要采集博客园首页推荐文章的标题,在ASP.NET中可以编写如下代码:

  1. HtmlWeb htmlWeb = new HtmlWeb();
  2. HtmlDocument htmlDoc = htmlWeb.Load(@"http://www.cnblogs.com/");
  3. HtmlNodeCollection anchors = htmlDoc.DocumentNode.SelectNodes(@"//a[@class='titlelnk']");
  4. foreach (HtmlNode anchor in anchors)
  5. Response.Write(anchor.InnerHtml + "<br/>");
  6. Response.End();

这段代码将采集到的首页html静态文本解析成Dom节点树,然后用Xpath表达式获取整个文档中class属性值为titlelnk的所有a元素。获取节点最常用节点对象的两个方法:SelectNodes("xpath表达式")和SelectSingleNode("xpath表达式"),前者返回节点集合HtmlNodeCollection的一个实例;后者返回满足条件的第一个节点,类型为HtmlNode的一个实例。后面的Foreach循环输出每个a元素的内联文本。

通常情况下,HtmlAgilityPack比正则表达式解析html更加高效准确,这体现在开发效率和运行性能两方面。HtmlAgilityPack的灵活性也是非常好的。例如将上面代码中的foreach循环体改成Response.Write(anchor.OuterHtml + "<br/>");则输出的是超链接本身而非内联文本。甚至可以修改超链接本身:

  1. foreach (HtmlNode anchor in anchors)
  2. {
  3. anchor.Attributes.Add("style", "color:red");
  4. Response.Write(anchor.OuterHtml + "<br/>");
  5. }

这样运行后你看到的是红色的超链接。你可以几乎随心所欲地对HtmlAgilityPack解析生成的Dom节点树上的节点操作,就像你拥有一颗自己的圣诞树,可以随意对其修整剪裁。这也是正则方法无法相提并论的。HtmlAgilityPack对源文本的结构要求非常宽松,即使没有根元素也一样正常使用,这同要求非常严格的XmlDocument完全不同。熟练掌握HtmlAgilityPack解析html文档的关键在于熟悉Xpath表达式语法,好在Xpath的语法入门比较简单,只需花费数个小时基本就可满足大部分应用。依托于Dom高效而通用的结构,Xpath强大而简练的语法,HtmlAgilityPack真可以称为“解析html和采集网页的神兵利器”。

解析html和采集网页的神兵利器的更多相关文章

  1. API例子:用Python驱动Firefox采集网页数据

    1,引言 本文讲解怎样用Python驱动Firefox浏览器写一个简易的网页数据采集器.开源Python即时网络爬虫项目将与Scrapy(基于twisted的异步网络框架)集成,所以本例将使用Scra ...

  2. Jsoup后台解析html、jsp网页

    在一些网络爬虫或者从第三方网站抓取信息的程序都面临1个问题,如何从网页中把所需的信息提取出来,Jsoup是个比较好的选择,它能把网站内容解析成Document,再从document中取element就 ...

  3. 用js采集网页数据并插入数据库最快的方法

    今天教大家一个快速采集网站数据的方法,因为太晚了,直接上例子,这里以采集易车网的产品数据为例. 思路:利用js获取网页数据并生成sql命令,执行sql命令把采集的数据插入数据库. 1.用谷歌浏览器或者 ...

  4. XPath2Doc,一个半自动采集网页生成Word Docx文件的工具,带企查查和天眼查模板

    原始出处:https://www.cnblogs.com/Charltsing/p/XPath2Doc.html 很多人需要从网站采集一些数据填写Word模板,手工操作费时费力还容易出错,所以我给朋友 ...

  5. curl模拟自动登陆&采集网页数据

    <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...

  6. csharp:正则表达式采集网页数据

    https://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex(v=vs.110).aspx https:/ ...

  7. 采集网页数据---Using Java

    http://www.cnblogs.com/longwu/archive/2011/12/24/2300110.html 1).学习网页数据采集,首先必不可少的是学习java的正则表达式(Regex ...

  8. php curl函数采集网页出现gzip压缩、编码不同导致的乱码 图文解决方法

    方法一: header("content-type:text/html;charset=utf-8");$url="http://115.47.116.10/rest/k ...

  9. Asp.Net采集网页方法大全(5种)

    /// <summary>方法一:比较推荐 /// 用HttpWebRequest取得网页源码 /// 对于带BOM的网页很有效,不管是什么编码都能正确识别 /// </summar ...

随机推荐

  1. WinForm中DataGridView的全选与取消全选

    /// <summary> /// 全选 /// </summary> private void SelectAll() { //结束列表的编辑状态,否则可能无法改变Check ...

  2. CANOpen学习指南

    对于初学者,相对于其他总线的资料来说,在国内CANOpen的资料并不多.而且并不是所有资料都适合初学者看的.这里给出一些建议,对CANOpen感兴趣的,可以参考一下学习的顺序. 前提:需要对CAN总线 ...

  3. 6/10 sprint2 看板和燃尽图的更新

  4. 分离链表法散列ADT

    分离链表法解决冲突的散列表ADT实现 数据结构定义如下: struct ListNode; typedef struct ListNode *Position; struct HashTbl; typ ...

  5. linux 关机、重启

    一.重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 20 ...

  6. BZOJ5105 CodePlus2017晨跑

    这个题???我WA了两发??? #include<iostream> #include<cstdio> #include<cmath> #include<cs ...

  7. linux 配置文件(启动文件、环境文件)启动顺序

    1.登录shell 登录shell时,linux会按一定规则读取启动几个配置文件: /ect/profile $HOME/.bash_profile $HOME/.bashrc $HOME/.bash ...

  8. 使用refind引导多系统

    使用refind引导多系统 官网下载 rEFInd : http://www.rodsbooks.com/refind/getting.html 安装 rEFInd 教程: http://www.ro ...

  9. java10 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

  10. 【BZOJ1072】排列(搜索)

    [BZOJ1072]排列(搜索) 题面 BZOJ 洛谷 题解 算下复杂度,如果用\(next\_permutation\) 那就是\(10!\times 10\times 15\),复杂度不太对 那好 ...