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. EJB是什么

    EJB (enterprise java bean)   EJB 概念的剖析 我们先看一下,EJB 的官方解释: 商务软件的核心部分是它的业务逻辑.业务逻辑抽象了整个商务过程的流程,并使用计 算机语言 ...

  2. HBase 架构与工作原理2 - HBase 组件

    本文系转载,如有侵权,请联系我:likui0913@gmail.com 一.HBase 组件概览 Master-Slave 模式: HBase 体系结构遵循传统的 master-slave 模式,由一 ...

  3. java中为什么要进行对象序列化?

    序列化其实很好理解,假如你现在做一个项目,项目是分工合作的,并且你喝其他小组成员不在同一个城市,那么你要如何把你写的那些类给其他小组成员呢?这个时候就要用到序列化了,简单的说:序列化就是将内存中的类或 ...

  4. 【移动端debug-4】iOS下setTimeout无法触发focus事件的解决方案

    开篇总结:其实目前无法解决这个bug. 这两天做项目遇到了这个case,项目需求是打开页面的时候,input元素自动弹起键盘.由于各种方面的考虑,我们希望通过setTimeout延时200毫秒让inp ...

  5. 2018 焦作icpc现场赛总结

    Day 0 没有直达焦作的飞机,所以选择了先到新郑机场,再转乘城际列车.城际列车猜是专门给学生开通的吧,每天只有来和回一共两趟(所以机票选择的余地也不多).买的时候只有无座票了,本来以为会一直站着,但 ...

  6. 虚拟机VMware的安装

    什么是虚拟软件: 虚拟软件是一个可以使你在一台机器上同时运行二个或更多Windows.LINUX等系统.它可以模拟一个标准PC环境.这个环境和真实的计算机一样,都有芯片组.CPU.内存.显卡.声卡.网 ...

  7. BZOJ3309 DZY Loves Math(莫比乌斯反演+线性筛)

    一通正常的莫比乌斯反演后,我们只需要求出g(n)=Σf(d)*μ(n/d)的前缀和就好了. 考虑怎么求g(n).当然是打表啊.设n=∏piai,n/d=∏pibi .显然若存在bi>1则这个d没 ...

  8. Distinct Substrings SPOJ - DISUBSTR(后缀数组水题)

    求不重复的子串个数 用所有的减去height就好了 推出来的... #include <iostream> #include <cstdio> #include <sst ...

  9. MT【143】统一分母

    已知$a,b>0$,则$m=\dfrac{b^2+2}{a+b}+\dfrac{a^2}{ab+1}$的最小值是______ 解答: $$m\geqslant \dfrac{b^2+2}{\sq ...

  10. 使用IDEA远程部署tomcat和调试

    环境: CentOS 7 Tomcat 9.0.1 jdk-9.0.1 IntelliJ IDEA 2017.3 Tomcat中的配置 在catalina.sh文件中加入以下的配置 CATALINA_ ...