一、環境準備
1. 引用方式
兩種主流實作方案:
- 舊式作法:手動匯入
HtmlAgilityPack.dll - 建議作法:透過 NuGet 安裝套件
Install-Package HtmlAgilityPack
2. 常用核心類別
| 類別名稱 | 用途說明 |
|---|---|
HtmlDocument | HTML 文件容器,負責載入 HTML 原始碼 |
HtmlWeb | 網路請求類別,直接透過網址抓取網頁 HTML |
HtmlNode | 單一 HTML DOM 節點(div/a/p 等標籤) |
HtmlNodeCollection | HtmlNode集合,存放多筆查詢結果 |
二、兩種 HTML 載入方式
兩種方式最後都會取得 HtmlDocument 物件
1:載入本機檔案 / HTML 字串
- 載入本機 HTML 檔案
using HtmlAgilityPack;
using System.Text;
HtmlDocument document = new HtmlDocument();
// 載入本機檔案,指定編碼
document.Load("news.htm", Encoding.UTF8);Code language: JavaScript (javascript)
- 載入 HTML 文字字串
string htmlStr = "<html>...</html>";
document.LoadHtml(htmlStr);Code language: HTML, XML (xml)
2:線上載入網頁
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("https://example.com");Code language: JavaScript (javascript)
三、節點查詢
// 1. 建立文件物件
HtmlDocument document = new HtmlDocument();
// 2. 讀取本機 html 檔案
document.Load("news.htm", Encoding.UTF8);
// 3. 取得文件根節點
HtmlNode rootNode = document.DocumentNode;
// 4. 使用XPath批量查詢節點,回傳節點集合
HtmlNodeCollection newsList = rootNode.SelectNodes(
@"//html/body/div[@class='content']/div/div[@class='left']/div[1]/div[@class='blk12']/div[@class='blk122']/a"
);Code language: JavaScript (javascript)
重要方法說明
SelectSingleNode("XPath"):匹配第一個符合條件的節點,回傳HtmlNodeSelectNodes("XPath"):匹配全部符合條件的節點,回傳HtmlNodeCollection- 教材範例寫完整絕對路徑;實務開發建議優先使用全域相對搜尋簡化 XPath,降低網頁改版造成 XPath 失效風險:
//div[@class='blk122']/aCode language: JSON / JSON with Comments (json)
四、迴圈讀取內容範例
if(newsList != null)
{
foreach(HtmlNode aNode in newsList)
{
string title = aNode.InnerText; // 取得標籤內文字
string link = aNode.GetAttributeValue("href",""); // 讀取href屬性
}
}Code language: PHP (php)
五、常用屬性速查表
.InnerText:標籤內純文字內容.InnerHtml:標籤內含子標籤的 HTML 原始碼.OuterHtml:當前標籤本身加上內部全部 HTMLGetAttributeValue("屬性名稱","預設值"):安全讀取標籤屬性
實際應用