博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# HTML解析工具HtmlAgilityPack使用简介
阅读量:4287 次
发布时间:2019-05-27

本文共 5511 字,大约阅读时间需要 18 分钟。

一、说明,官方CodePlex地址:

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

Html Agility Pack最常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类。其中HtmlWeb类帮助获取Web页面很方面。

二、添加引用很简单

Install-Package HtmlAgilityPack

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那样方便。

转载地址:http://wbogi.baihongyu.com/

你可能感兴趣的文章
【新欢与旧爱 大牌明星代言法则】
查看>>
【李某某进入少管所服刑 满18周岁后移送成人监狱】
查看>>
【全球著名时尚达人代言珑骧2014春夏系列】
查看>>
【贝克汉姆夫妇携手登封面 拍摄圣诞节大片】
查看>>
【我们就爱穿上古着晒幸福】
查看>>
【赵薇与贝嫂希尔顿撞包】
查看>>
【王菲机场背3万LV包 气场压过代言人范爷】
查看>>
【可疑代码扫描器V0.12最新绿色版】
查看>>
【色空win7动漫美女诱惑主题】
查看>>
【美女送福利了win7主题】
查看>>
【解析关电脑后CPU风扇转不停问题】
查看>>
【内网不正常引起死机解决办法】
查看>>
【5步搜索到无线网卡信号】
查看>>
优酷客户端3.8.0 [优酷客户端官方正式版]
查看>>
【还原win7系统默认字体的方法】
查看>>
重庆一号通V2011官方版[新型电信服务]
查看>>
【图文】教你设置Win8系统中家长控制
查看>>
【主题世界】阿狸对着你卖萌桌面主题
查看>>
【加密桌面便签】V1.1正式版简体中文
查看>>
【Windows7系统装什么浏览器好用】
查看>>