取得文件物件
1. 建立文件物件
HtmlDocument document = new HtmlDocument();Code language: JavaScript (javascript)
2. 兩種載入方式
1)載入HTML字串
document.LoadHtml(htmlString);Code language: JavaScript (javascript)
2)載入本機HTML檔案(指定編碼避免亂碼)
document.Load(@"c:/news.html", Encoding.UTF8);Code language: JavaScript (javascript)
Windows路徑建議使用
@關閉轉義;教材裡的c://news.html僅為寫法範例。
3. 取得根節點
HtmlNode rootNode = document.DocumentNode;Code language: JavaScript (javascript)
所有xpath查詢都以rootNode作為基底執行。
節點操作
1. 透過節點HTML建立新節點
HtmlNode newNode = HtmlNode.CreateNode(newsNode.OuterHtml);
OuterHtml:包含自身標籤與內部全部HTML內容- 常用來複製節點、擷取局部HTML單獨解析
2. 查詢節點
SelectSingleNode("XPath"):比對第一個符合的節點,回傳HtmlNode
HtmlNode childNode = itemNode.SelectSingleNode("//div[1]");Code language: JavaScript (javascript)
SelectNodes("XPath"):比對全部符合節點,回傳HtmlNodeCollection
3. 讀取文字與屬性
- 取得節點內純文字
string text = itemNode.InnerText;
- 讀取標籤屬性(基礎寫法)
string href = itemNode.Attributes["href"].Value;Code language: JavaScript (javascript)
風險提醒:如果標籤沒有
href屬性,直接呼叫Attributes["href"]會得到null,造成程式報錯。
建議使用安全寫法:
string href = itemNode.GetAttributeValue("href", "");Code language: JavaScript (javascript)
4. 完整範例:遍歷新聞清單
foreach (HtmlNode item in newsList)
{
string title = item.InnerText;
string href = item.Attributes["href"].Value;
}Code language: PHP (php)
補充說明
- 空值處理
SelectNodes()找不到對應節點會回傳null,進行foreach迴圈前一定要做判斷:
if(newsList != null)
{
foreach(var item in newsList){ ... }
}Code language: PHP (php)
- InnerText / InnerHtml / OuterHtml 差異
InnerText:只擷取文字,會移除全部標籤InnerHtml:節點內部HTML,不包含自身標籤OuterHtml:自身標籤加上內部全部HTML
- XPath小技巧
//div代表全域搜尋所有div;不加//只比對直接子節點。
完整範例程式
using HtmlAgilityPack;
using System.Text;
//1.初始化文件
HtmlDocument document = new HtmlDocument();
document.Load("news.htm", Encoding.UTF8);
HtmlNode rootNode = document.DocumentNode;
//2.批次查詢新聞連結
HtmlNodeCollection newsList = rootNode.SelectNodes(@"//div[@class='blk122']/a");
if(newsList != null)
{
foreach (HtmlNode item in newsList)
{
string title = item.InnerText.Trim();
string link = item.GetAttributeValue("href", "");
Console.WriteLine($"標題:{title} 連結:{link}");
}
}Code language: JavaScript (javascript)
取得文件內容
Previous: 實際應用