亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【轉】C#類似Jquery的html解析類HtmlAgilityPack基礎類介紹及運用

2019-11-14 13:46:45
字體:
來源:轉載
供稿:網友

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

 

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
{
staticvoid Main(string[] args)
{
HtmlWeb web
=new HtmlWeb();
HtmlDocument doc
= web.Load("http://www.49028c.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("http://*[@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();
}

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


}
}

 轉自:http://www.49028c.com/huangcong/p/3408309.html

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性感美女h网站在线观看免费| 在线亚洲欧美视频| 国产福利视频一区| 国模视频一区二区| 国产欧美日韩丝袜精品一区| 久久人人爽人人爽人人片av高请| 亚洲在线免费看| 97在线看免费观看视频在线观看| 国产精品高潮在线| 亚洲第一男人天堂| 国产精品视频一区二区三区四| 国产999精品久久久影片官网| 亚洲欧洲成视频免费观看| 欧美另类69精品久久久久9999| 欧美性感美女h网站在线观看免费| 66m—66摸成人免费视频| 精品欧美一区二区三区| 久久精品99久久久久久久久| 亚洲韩国日本中文字幕| 日韩精品视频在线观看网址| 亚洲国产精品中文| 久久久噜噜噜久噜久久| 亚洲国产成人精品久久久国产成人一区| 一区二区三区日韩在线| 成人黄色av网| 亚洲激情 国产| 社区色欧美激情 | 欧美一级高清免费播放| 国产精品一区二区女厕厕| 久久久久九九九九| 91国偷自产一区二区三区的观看方式| 8x拔播拔播x8国产精品| 久久精品国产69国产精品亚洲| 日韩一区二区三区xxxx| 91久久精品日日躁夜夜躁国产| 另类色图亚洲色图| 97成人精品区在线播放| 日韩av手机在线观看| 亚洲最大福利视频| 亚洲人成网7777777国产| 亚洲成人三级在线| 午夜精品久久久久久久久久久久久| 亚洲男人天天操| 亲子乱一区二区三区电影| 中文字幕在线看视频国产欧美| 91久久在线播放| 日韩在线观看网站| 97免费中文视频在线观看| 久久久av亚洲男天堂| 国产精品视频中文字幕91| 久热99视频在线观看| 欧美理论电影网| 中文字幕亚洲一区在线观看| 欧美激情一区二区久久久| 成人中文字幕在线观看| 国产成人精品视频在线观看| 国产一区二中文字幕在线看| 亚洲精品ady| 精品视频久久久| 欧美精品情趣视频| 亚洲欧美色婷婷| 久久噜噜噜精品国产亚洲综合| 91黑丝高跟在线| 午夜精品久久久久久久久久久久久| 亚洲黄色免费三级| 国产精品国产自产拍高清av水多| 国产精品老女人视频| 亚洲无限乱码一二三四麻| 97精品久久久| 久久99久久亚洲国产| 尤物yw午夜国产精品视频明星| 欧美极品美女视频网站在线观看免费| 欧美最猛性xxxxx(亚洲精品)| 欧美一区在线直播| 欧美日韩在线观看视频| 97在线视频精品| 日韩欧美成人免费视频| 亚洲区中文字幕| 精品无人区太爽高潮在线播放| 欧美理论片在线观看| 亚洲精品videossex少妇| 亚洲国产天堂久久综合| 久久精品视频在线| 亚洲女成人图区| 九九热99久久久国产盗摄| 亚洲欧美综合精品久久成人| 欧美人与性动交a欧美精品| 自拍偷拍免费精品| 亚洲欧美成人在线| 热99在线视频| 精品综合久久久久久97| 欧美老肥婆性猛交视频| 九九热精品视频| 国产精品视频成人| 国产91ⅴ在线精品免费观看| 亚洲精品之草原avav久久| 日本午夜精品理论片a级appf发布| 中文字幕亚洲图片| 久久天天躁狠狠躁老女人| 欧美成人高清视频| 欧美精品制服第一页| 欧美电影免费观看电视剧大全| 久久久久久久久久久亚洲| 26uuu久久噜噜噜噜| 亚洲欧美日韩精品久久亚洲区| 国产91九色视频| 国产精品色悠悠| 欧美中文在线观看国产| 日韩专区在线播放| 国产精品永久免费观看| 国产噜噜噜噜噜久久久久久久久| 日韩在线观看免费全集电视剧网站| 亚洲人成在线电影| 欧美一级淫片播放口| 精品久久久久久久久国产字幕| 久久av在线看| 亚洲老头老太hd| 亚洲一区精品电影| 国产精品视频在线观看| 欧美亚洲另类制服自拍| 色综合色综合网色综合| 亚洲第一福利视频| 欧美激情综合色| 国产黑人绿帽在线第一区| 成人h片在线播放免费网站| 国产精品网红福利| 中文字幕在线观看亚洲| 亚洲激情视频网站| 91精品国产综合久久久久久久久| 日本久久精品视频| 欧美精品激情blacked18| 欧美影院在线播放| 久久成人18免费网站| 91在线免费看网站| 亚洲片在线资源| 亚洲精品日韩久久久| 亚洲欧美另类自拍| 亚洲国产三级网| 欧美精品电影在线| 亚洲精品久久久一区二区三区| www国产91| 亚洲精品国产品国语在线| 成人黄色片网站| 久热在线中文字幕色999舞| 亚洲美女在线观看| 亚洲视频网站在线观看| 欧美亚洲成人网| 国产精品福利久久久| 国产精品一区二区久久精品| 一道本无吗dⅴd在线播放一区| 国产精品久久一| 欧美理论电影网| 久久91精品国产91久久跳| 日产精品久久久一区二区福利| 国产精品久久久久免费a∨| 欧美激情一二区| 亚洲视频在线观看免费| 日韩国产欧美区| 久久久国产在线视频| 亚洲高清av在线| 久久精品在线视频| 久久香蕉国产线看观看网| 欧洲亚洲免费视频| 久久久久久97|