Html Agility Pack基础类介绍及运用

简介: 原文:Html Agility Pack基础类介绍及运用   Html Agility Pack下载地址:http://htmlagilitypack.codeplex.com/  Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:)   第一篇只对Html Agility Pack做了一个大概的介绍,在接下来的章节会比较深入的介绍Html Agility Pack。

原文:Html Agility Pack基础类介绍及运用

 

Html Agility Pack下载地址:http://htmlagilitypack.codeplex.com/ 

Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:)

 

第一篇只对Html Agility Pack做了一个大概的介绍,在接下来的章节会比较深入的介绍Html Agility Pack。

 

Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:)

基础类和基础方法介绍

Html Agility Pack最常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类。

 

HtmlDocument类

当然在解析DOM前需要加载html原始文件或者html的字符串,HtmlDocument类封装了支持此功能的方法,下面是加载html的方法介绍。


HtmlDocument类定义了多个重载的Load方法来实现以不同方式加载html,其实主要分为两种,一种是从Stream中加载html,另外一种是从物理路径加载html,分别见下面:


方法:public void Load(TextReader reader)
说明:从指定的 TextReader对象中加载Html
示例

HtmlDcument doc = new HtmlDocument();

StreamReader sr
= File.OpenText( " file path " );

doc.Load(sr);

 

 


基于上面方法,衍生出了几个不同重载方法。

以指定的Stream对象为主的有:

(1)public void Load(Stream stream)    ///从指定的Stream对象中加载html;

(2)public void Load(Stream stream, bool detectEncodingFromByteOrderMarks)    ///指定是否从顺序字节流中解析编码格式

(3)public void Load(Stream stream, Encoding encoding)    ///指定编码格式

(4)public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)

(5)public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)


以指定的物理路径为主的有:

 (1)public void Load(string path)

(2)public void Load(string path, bool detectEncodingFromByteOrderMarks)    ///指定是否从顺序字节流中解析编码格式

(3)public void Load(string path, Encoding encoding)    ///指定编码格式

(4)public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)

(5)public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)

 

HtmlDocument类中还定义了直接从html字符串中加载Html,如下:


方法:public void LoadHtml(string html)
说明:从指定的html字符串中加载html
示例

HtmlDocument doc = new HtmlDocument();

string html = " <div id= " demo " ><span style= " color:red; " ><h1>Hello World!</h1></span></div> " ;

doc.LoadHtml(html);

 

 


HtmlDocument类还有其他写DOM方法的定义,这里不作详细介绍,留作以后专门介绍Html Agility Pack写DOM章节介绍吧,这里着重介绍Html Agility pack解析DOM的细节。

 

HtmlNode类和HtmlNodeCollection类


通过HtmlDocument把html加载进来后,接着是要做什么呢?当然是对html解析了,解析DOM就需要提到HtmlNode类了。 HtmlDocument类由属性DocumentNode属性返回当前Html解析后的一个全局的HtmlNode对象;如果想获取某一个元素的 HtmlNode,可以通过HtmlDocument类的GetElementbyId(string Id)方法来获取,返回指定某一个html元素的HtmlNode对象。如何通过HtmlNode对象来访问DOM呢?介绍之前先对它的功能了解下。


HtmlNode类实现了IXPathNavigable接口,这说明了它可以通过xpath来查询DOM了,如果对System.Xml命名空间下的 XmlDocument类了解的,特别是使用过了SelectNodes()和SelectSingleNode()方法的朋友对使用HtmlNode类将会很熟悉。其实Html Agility Pack内部是把html解析成xml文档格式了的,所以支持xml中的一些常用查询方式。下面对HtmlNode的一些主要的常用成员作简要的说明。

 

HtmlNode类的主要属性

1)Attributes属性

获取当前Html元素的属性的集合,返回的是一个HtmlAttributeCollection对象。如一个div元素,它可能会定义一些属性,如:<div id="title" name="title" class="class-name" title="title div">***</div>,那Attributes返回的HtmlAttributeCollection就包含了 “id,name,class,title”的信息。HtmlAttributeCollection类是实现了接口 IList<HtmlAttribute>的一个集合类,故此可以通过下面代码方式访问每一个成员。

HtmlNode node = doc.GetElementbyId( " title " );

string titleValue = node.Attributes[ " title " ].Value;

 


或者

 

foreach (HtmlAttribute attr in node.Attributes)

{

Console.WriteLine(
" {0}={1} " ,attr.Name,attr.Value);

}

 


在获取属性值时,如果某一个属性名称不存在的话,Attributes["name"]返回的是null值。


2)FirstChild,LastChild,ChildNodes,ParentNode属性


FirstChild属性:返回所有子节点的第一个节点,如下面代码:

 

string html = " <div id= " demo " ><span style= " color:red; " ><h1>Hello World!</h1></span><div id= " innerDiv " >inner div</div></div> " ;

 

 

 

FirstChild则返回的是“<span style="color:red;"><h1>Hello World!</h1></span>” 的节点。


LastChild属性:返回所有子节点的最后一个节点,以上面的html为例,则返回“<div id="innerDiv">inner div</div>”节点。


ChildNodes属性:返回当前节点所有直接一代的子节点的集合,不包括跨代子节点,以上面的html为例,则返回“<span style="color:red;"><h1>Hello World!</h1></span>” 和“<div id="innerDiv">inner div</div>”两个节点。


ParentNode属性:返回当前节点的直接父节点。

 

3)获取Html源码和文本


HtmlNode类设计了OuterHtml属性和InnerHtml属性用于获取当前节点的Html源码。两者不同之处是,OuterHtml属性返回的是包含当前节点的Html代码在内的所有Html代码,而InnerHtml属性返回的是当前节点里面子节点的所有Html代码。如下面:

 

代码
HtmlDocument doc = new HtmlDocument();

string html = " <div id= " demo " ><span style= " color:red; " ><h1>Hello World!</h1></span></div> " ;

doc.LoadHtml(html);


HtmlNode node
= doc.HtmlDocument;

Console.WriteLine(node.OuterHtml);
/// return " <div id="demo"><span style="color:red;"><h1> Hello World! </h1></span></div> ";
Console.WriteLine(node.InnerHtml); /// return " <span style="color:red;"><h1> Hello World! </h1></span> ";

 


如要获取节点的文本值,通过InnerText属性来获取,InnerText属性过滤掉了所有的Html标记代码,只返回文本值,如下面:

 

Console.WriteLine(node.InnerText); /// return "Hello World!";

 

 

 

HtmlNode类的主要方法

HtmlNode类提供了足够丰富的方法供查询当前节点下的子节点(元素),当然也包括查询当前节点的父节点(元素)的方法,下面列出主要的方法和使用说明。


获取父节点的系列方法:

1)public IEnumerable<HtmlNode> Ancestors()

获取当前节点的父节点列表(不包含自身)。

2)public IEnumerable<HtmlNode> Ancestors(string name)

以指定一个名称来获取父节点的列表(不包含自身)。

3)public IEnumerable<HtmlNode> AncestorsAndSelf()

获取当前节点的父节点列表(包含自身)。

4)public IEnumerable<HtmlNode> AncestorsAndSelf(string name)

以指定一个名称来获取父节点的列表(包含自身)。

获取子节点的系列方法:

1)public IEnumerable<HtmlNode> DescendantNodes()

获取当前节点下的所有子节点的列表,包括子节点的子节点(不包含自身)。

2)public IEnumerable<HtmlNode> DescendantNodesAndSelf()

获取当前节点下的所有子节点的列表,包括子节点的子节点(包含自身)。

3)public IEnumerable<HtmlNode> Descendants()

获取当前节点下的直接子节点的列表(不包含自身)。

4)public IEnumerable<HtmlNode> DescendantsAndSelf()

获取当前节点下的直接子节点的列表(包含自身)。

5)public IEnumerable<HtmlNode> Descendants(string name)

获取当前节点下的以指定名称的子节点列表。

6)public IEnumerable<HtmlNode> DescendantsAndSelf(string name)

获取当前节点下的以指定名称的子节点的列表(包含自身)。

7)public HtmlNode Element(string name)

获取第一个符合指定名称的直接子节点的节点元素。

8)public IEnumerable<HtmlNode> Elements(string name)

获取符合指定名称的所有直接子节点的节点列表。

9)public HtmlNodeCollection SelectNodes(string xpath)

获取符合指定的xpath的子节点列表。

10)public HtmlNode SelectSingleNode(string xpath)

获取符合指定的xpath的单个字节点元素。


查询节点的方法主要是上面10个方法,该类还有其他写节点的系列方法,这里不详细介绍写操作的方法,留作以后详细介绍。

结合Xpath进行查询节点是功能比较强大,这像操作xml那样方便。


简单例子的代码

下面例子是把博客园的精华区博客列表查询出来。执行结果如下面:

 


代码

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using HtmlAgilityPack;


namespace DemoCnBlogs
{
class Program
{
static void Main( string [] args)
{
HtmlWeb web
= new HtmlWeb();
HtmlDocument doc
= web.Load( " http://www.cnblogs.com/pick/ " );

HtmlNode node
= doc.GetElementbyId( " post_list " );

StreamWriter sw
= File.CreateText( " log.txt " );

foreach (HtmlNode child in node.ChildNodes)
{
if (child.Attributes[ " class " ] == null || child.Attributes[ " class " ].Value != " post_item " )
continue ;
HtmlNode hn
= HtmlNode.CreateNode(child.OuterHtml);

/// 如果用child.SelectSingleNode("//*[@class=\"titlelnk\"]").InnerText这样的方式查询,是永远以整个document为基准来查询,
/// 这点就不好,理应以当前child节点的html为基准才对。

Write(sw, String.Format(
" 推荐:{0} " , hn.SelectSingleNode( " //*[@class=\ " diggnum\ " ] " ).InnerText));
Write(sw, String.Format(
" 标题:{0} " , hn.SelectSingleNode( " //*[@class=\ " titlelnk\ " ] " ).InnerText));
Write(sw, String.Format(
" 介绍:{0} " , hn.SelectSingleNode( " //*[@class=\ " post_item_summary\ " ] " ).InnerText));
Write(sw, String.Format(
" 信息:{0} " , hn.SelectSingleNode( " //*[@class=\ " post_item_foot\ " ] " ).InnerText));

Write(sw,
" ---------------------------------------- " );

}

sw.Close();

Console.ReadLine();
}

static void Write(StreamWriter writer, string str)
{
Console.WriteLine(str);
writer.WriteLine(str);
}


}
}

 

 

 

 


目录
相关文章
|
Web App开发 C#
Html Agility Pack (HAP) 应用入门
上一节简单介绍了 Html Agility Pack (HAP):c# HTML 解析利器 。 本节以一个简单的例子说说 Html Agility Pack (HAP)  的应用。 一、下载 or 安装 1、下载 使用 VS 2015 之前的版本,需要将 Html Agility Pack (HAP) 发布版本下载到本地,然后添加引用。
1190 0
|
Web App开发 JavaScript C#
Html Agility Pack (HAP):c# HTML 解析利器
Html Agility Pack (HAP)是一个敏捷的HTML解析器,它构建了一个读/写DOM,并且支持普通的XPATH或者XSLT(实际上你不需要理解XPATH或者XSLT来使用它,不用担心)。
1019 0
|
Web App开发 XML JavaScript
HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦
原文:HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦 自从 Web 应用程序自 1993 年 W3C 设立以来就开始发展,而且 HTML 也历经了数个版本的演化(1.0 – 2.0 – 3.0 – 3.2 – 4.0 – 4.01),现在也已经成为Web网页或应用程序的最基础,想要学习如何设计 Web 网页或开发 Web 应用程序,这已经是绝对必须要学的东西了,就算是方便的控件(例如 ASP.NET),但 HTML 仍然有学习它的必要性,因此如果不会 HTML,就等于没学过 Web 网页一般。
1145 0
|
XML 数据格式 C#
一款很不错的html转xml工具-Html Agility Pack
原文:一款很不错的html转xml工具-Html Agility Pack   之前发个一篇关于实现html转成xml的劣作《实现html转Xml》,受到不少网友的关心。该实现方法是借助htmlparser去分解html内容,然后按照dom的结构逐个生成xml字符串。
1011 0
|
14天前
|
前端开发 JavaScript 开发工具
【HTML/CSS】入门导学篇
【HTML/CSS】入门导学篇
23 0
|
5天前
|
数据采集 前端开发 网络协议
如何使用代理IP通过HTML和CSS采集数据
如何使用代理IP通过HTML和CSS采集数据
|
9天前
|
前端开发 搜索推荐 数据安全/隐私保护
HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
18 1
|
9天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
16天前
|
JSON JavaScript 前端开发
js是什么、html、css
js是什么、html、css