技术开发 频道

方便可靠!Html Agility Pack解析HTML页

    【IT168 技术】前言

  现在,在不少应用场合中都希望做到数据抓取,特别是基于网页部分的抓取。其实网页抓取的过程实际上是通过编程的方法,去抓取不同网站网页后,再进行分析筛选的过程。比如,有的比较购物网站,会同时去抓取不同购物网站的数据并将其保存在数据库中。一般,这些网页的抓取都需要对抓取回来的HTML进行解析。

  .NET提供了很多类去访问并获得远程网页的数据,比如WebClient类和HttpWebRequest类。这些类对于利用HTTP去访问远端的网页并且下载下来是很有用的,但在对于所下载下来的HTML的解析能力方面,则显得功能很弱了,以往,开发者不得不用很简陋的方法,比如使用String.IndexOf,String.Substring或使用正则表达式去解析。

  另外一种解析HTML的方法是使用开源的工具包HTML Agility Pack(http://htmlagilitypack.codeplex.com/),它的设计目标是尽可能简化对HTML文档的读和写。这个包本身是利用了DOM文档对象模型去解析HTML的。仅需要几行代码,开发者就可以利用DOM 去访问文档中的头部一直到它的孩子结点。HTML Agility包也能通过XPATH去访问DOM中的指定结点,同时,它也包含了一个类可以用来下载远程网站上的网页,这意味者开发者可以利用它,同时下载并且解析HTML网页了,十分方便。

  本文将以几个例子展示如何使用HTML Agility包去下载和解析网页,代码例子在附件中可以下载。

  准备工作

  可以从http://htmlagilitypack.codeplex.com/)去下载Html Agility包,注意必须运行在ASP.NET 3.5及以后的版本上。下载后,这个工具包实际上是以HtmlAgilityPack.dll形式存在的。使用的时候,只需要将这个dll放在你的网站或工程的bin目录下就可以了,我们目前使用的版本是1.4。

  下面我们分别通过三个例子去说明如何使用HTML Agility。

  例子一:列出远程网页的META标签

  网页的抓取一般涉及到下载指定的网页,并且抓取指定的信息片断。第一个例子指导如何使用Html Agility包去下载一个网页,并且逐一循环显示出HTML页中的同时有名称和content标签的 标签中。

  Html Agility Pack包包含了一些类,它们都在HtmlAgilityPack这个命名空间中,因此在使用前,先要引用这个命名空间,如下:

using HtmlAgilityPack;

  要从网站上去下载网页,可以使用HtmlWeb类的Load方法,当然实现要新建一个HtmlWeb的对象实例,如下:

var webGet = new HtmlWeb();
var document
= webGet.Load(url);

  其中Load方法会返回一个HtmlDocument对象。在上面的代码中,我们把返回的HtmlDocument对象赋值到一个本地变量document中去。HtmlDocument这个类代表了一个完整的HTML文档并且包含了DocumentNode属性,这个属性返回的是一个代表文档根结点的HtmlNode对象。

  HtmlNode类有几个属性,都十分简单,主要是用来遍历DOM的,包括:

  ParentNode:访问父结点

  ChildNodes:访问孩子结点

  NextSibling:某个元素的下一个兄弟元素(也就是说同层次元素中的下一个元素)

  PreviousSibling :某个元素的上一个兄弟元素(也就是说同层次元素中的上一个元素)

  对于结点本身的判断,有如下属性:

  Name - 获得或设置结点的名称。对HTML元素来说,它返回标签中的内容,比如对于BODY标签,则返回结果为”body ”,对于[P]标签则返回结果为”p ”,如此类推

     Attributes -返回该元素的所有属性的集合

  InnerHtml -返回或设置该元素中的HTML内容。

  InnerText -返回结点的文本文字。

  NodeType -指出结点的类型,可以是Document,Element,Comment或者是文本。

 

 

 

0
相关文章