取得文件內容

取得文件物件

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. 讀取文字與屬性

  1. 取得節點內純文字
string text = itemNode.InnerText;
  1. 讀取標籤屬性(基礎寫法)
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)

補充說明

  1. 空值處理
    SelectNodes()找不到對應節點會回傳null,進行foreach迴圈前一定要做判斷:
if(newsList != null)
{
    foreach(var item in newsList){ ... }
}Code language: PHP (php)
  1. InnerText / InnerHtml / OuterHtml 差異
  • InnerText:只擷取文字,會移除全部標籤
  • InnerHtml:節點內部HTML,不包含自身標籤
  • OuterHtml:自身標籤加上內部全部HTML
  1. 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:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *