1. 程式人生 > >C# HTML解析工具HtmlAgilityPack使用簡介

C# HTML解析工具HtmlAgilityPack使用簡介

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


相關推薦

C# HTML解析工具HtmlAgilityPack使用簡介

Html Agility Pack 不算一個很複雜的類庫,但它的功能確不弱,為解析DOM已經提供了足夠強大的功能支援,可以跟jQuery操作DOM媲美:) Html Agility Pack最常用的基礎類其實不多,對解析DOM來說,就只有HtmlDocument和Html

C# HTML解析工具HtmlAgilityPack使用例項(二)--Web頁面

一、使用XPath精確解析指定的Dom節點 XPath字串的簡單獲取方法,是在瀏覽器開發者工具中指定節點右鍵》“Copy XPath” 如圖 //載入Web 的頁面並解析內容 string rowP

黃聰:C#類似Jquery的html解析HtmlAgilityPack基礎類介紹及運用

Html Agility Pack 原始碼中的類大概有28個左右,其實不算一個很複雜的類庫,但它的功能確不弱,為解析DOM已經提供了足夠強大的功能支援,可以跟jQuery操作DOM媲美:) 基礎類和基礎方法介紹 Html Agility Pack最常用的基礎類其實不多,對解析DOM來說,就只有

C# html解析器 ,解析HTML的各種工具比較。

引用: http://www.cnblogs.com/gaoweipeng/archive/2009/09/02/1558279.html 介紹了兩種不錯的HTML解析器的方法。 第一種方法:HTML正則表示式的方法。      參見:http://www.cnblog

Java爬蟲利器HTML解析工具-Jsoup

  Jsoup簡介      Java爬蟲解析HTML文件的工具有:htmlparser, Jsoup。本文將會詳細介紹Jsoup

.Net Core HTML解析利器之HtmlAgilityPack

安裝 document doc -a tails target 文件 ext detail 一 、HtmlAgilityPack簡介 這是一個敏捷的HTML解析器,它構建了一個讀/寫DOM,並支持簡單的XPATH或XSLT(實際上,你實際上並不了解XPATH和XSLT來使用

HTML 解析類庫HtmlAgilityPack

html解析 類型 dht 好的 cts 布爾 repos 通過 節點 1. HtmlAgilityPack簡介 網站中首先遇到的問題是爬蟲和解析HTML的問題,一般情況在獲取頁面少量信息的情況下,我們可以使用正則來精確匹配目標。不過本身正則表達式就比較復雜,同時正

java中幾種解析html工具

HTML分析是一個比較複雜的工作,Java世界主要有幾款比較方便的分析工具: 1.Jsoup  Jsoup是一個集強大和便利於一體的HTML解析工具。它方便的地方是,可以用於支援用jQuery中css selector的方式選取元素,這對於熟悉js的開發者來說基本沒有學

C#自寫的一個HTML解析類(類似XElement語法)

功能: 1、輕鬆獲取指元素HTML元素。 2、可以根據屬性標籤進行篩選 3、返回的都是Llist強型別無需轉換   用過XElement的都知道 用來解析XML非常的方便,但是對於HTML的格式多樣化實在是沒辦法相容。 所以我就寫了這麼一個類似XElement的 XHTMLEl

C#簡單爬取資料(.NET使用HTML解析器ESoup和正則兩種方式匹配資料)

一、獲取資料 想弄一個數據庫,由於需要一些人名,所以就去百度一下,然後發現了360圖書館中有很多人名 然後就像去複製一下,發現複製不了,需要登陸 此時f12檢視原始碼是可以複製的,不過就算可以複製想要插入資料也是很麻煩的。既然複製走不通,於是我抱著探索知識的精神,打開了Visual Studio 首先我

分針網——每日分享:HTML解析原理

html 原理 標準的web前端工程師需要知道 ◎瀏覽器(或者相應播放器)的渲染/重繪原理 這我得加把勁了。我還真的說的不是很清楚,我就G下,結果不是很多,找到了有一個,就記下來了。。。

[轉] 各種Json解析工具比較 - json-lib/Jackson/Gson/FastJson

config 1.2 content pretty 接口實現 turn sso processor true JSON技術的調研報告一 、各個JSON技術的簡介和優劣1.json-libjson-lib最開始的也是應用最廣泛的json解析工具,json-lib 不好的地方確

奪命雷公狗C/C++-----2---開發工具

實用 img nbsp log c++ 工具 技術分享 下載 開發 微軟給大家開發了一款很給力的產品他的名字叫做visual studio 2015,當然現在有2017了,但是這個還是看您自己的愛好來實用的 下載地址我就不公布了,需要的可以私密我噢奪命雷

復雜HTML解析

加載 整理 尋找 javascrip scrip 網頁 asc 網站 但是 面對頁面解析難題時候,需要註意問題: 1、尋找“打印次頁”的鏈接,或者看看網站有沒有HTML樣式更友好的移動版(把自己的請求頭設置成處於移動設備的狀態,然後接收網站移動版)。 2、尋找隱藏在Java

windows下dig 域名解析工具安裝及使用

dig 解析 windows 下nslookup 解析命令工具,都已經為人所熟悉。除此之外,在linux 或 unix上,dig命令工具在解析方面更是主導。下面主要說明下,dig如何在windows下安裝和使用dig 命令工具。dig的執行程序是在Bind軟件包裏,首先要下載Bind軟件,下載地址ht

[Windows] 【油猴腳本】慕課網視頻下載鏈接解析工具

nbsp 解析 baidu tar wid 轉載 forum uid 安裝教程 http://www.52pojie.cn/forum.php?mod=viewthread&tid=592829&fromguid=hot 好久沒出來發帖了 點進來的都

爬蟲-----HTML解析

一個 設備 數據 asc 避免 移動 title 裏的 自己 對HTML的解析:   在解析復雜的HTML的頁面時,需要避免一些問題,好讓爬蟲工作變得得心應手。      ? 尋找“打印此頁”的鏈接,或者看看網站有沒有HTML樣式更友好的移動版(把自己 的請求頭設置

.net/c#常用框架/中間件簡介

跨語言 bat 方法 entity 系統 wcf 序列 lpush 面向 任務調度 Quartz.NET:Quartz.NET是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。 Quartz.NET允 許開發人員根

JSON 解析工具的封裝(FastJSON-->Java)

str ras bool return pass pre mail lar 格式化json 1.添加依賴包 <dependency> <groupId>com.alibaba</groupId> <a

xml解析工具mashaller javaee自帶解析

for writer length star 工具 進行 去掉m comm err 1.怎樣去掉Marshaller的格式化? : JAXBContext context = JAXBContext.newInstance(Entity.class);