使用 C# 搭配 HtmlAgilityPack 來獲取網頁內容

最近團隊有個需求,需要從網頁上抓取一些資料,雖然普遍對於網路爬蟲的第一印象都是 python,但因為團隊中多數成員都是 C# developer,為了非常態性需求改使用 python,不僅開發效率變差,加上後續維護也會因為熟悉度不夠而多花不少時間在重新上手,因此還是決定以 C# 為主,只是爬網頁資料有不少套件可以利用,便想趁這個機會比較一下各家 library 的差異,以下是我比較的幾個 library 與筆記連結:

Html Agility Pack (HAP) 是用 C# 撰寫用於讀/寫 DOM 的 HTML 解析器,支援一般的 XPATH 或 XSLT

基本環境說明

  • macOS Sequoia 15.0 (Apple M2 Pro)
  • .NET SDK 8.0.401
  • NuGet Libraries
    • HtmlAgilityPack 1.11.66
    • HtmlAgilityPack.CssSelectors.NetCore 1.2.1
    • Fizzler.Systems.HtmlAgilityPack 1.2.1

使用方式

1result

心得

  • HtmlAgilityPack 原生僅支援 XPath,需要透過 HtmlAgilityPack.CssSelectors.NetCore 或是 Fizzler.Systems.HtmlAgilityPack 來支援 CSS Selector,雖然 Html Agility Pack 官方推薦 Fizzler.Systems.HtmlAgilityPack,但我實際使用起來有幾個不便的地方,我個人比較推薦 HtmlAgilityPack.CssSelectors.NetCore

    1. Fizzler.Systems.HtmlAgilityPack 是基於 HtmlNode,不如 HtmlAgilityPack.CssSelectors.NetCore 直接使用 HtmlDocument 便利
    2. HtmlAgilityPack.CssSelectors.NetCore 支援 {html tag}.class 的寫法,Fizzler.Systems.HtmlAgilityPack 則需要使用一般有效的寫法: {html tag}[class='{class name}']
  • 如何取得 xpath 或是 selector

    • 開啟瀏覽器的開發者工具並選取要取得的元素

      2developertool

    • 右鍵選擇 Copy –> Copy XPath 或是 Copy selector

      3copy

完整程式碼請參考 GitHub - yowko/html-agility-pack-demo

參考資料

  1. 使用 C# 搭配 HtmlAgilityPack 來獲取網頁內容
  2. 使用 C# 搭配 ScrapySharp 來獲取網頁內容
  3. 使用 C# 搭配 AngleSharp 來獲取網頁內容
  4. 使用 C# 搭配 Puppeteer Sharp 來獲取網頁內容
  5. 使用 C# 搭配 Selenium 來獲取網頁內容
  6. 使用 C# 搭配 Playwright 來獲取網頁內容
  7. C# Crawler 套件 Benchmark
  8. Html Agility Pack (HAP)
  9. GitHub - Fizzler.Systems.HtmlAgilityPack
  10. GitHub - HtmlAgilityPack.CssSelectors.NetCore
  11. 7 Best C# Web Scraping Libraries in 2024
  12. Popular Scraping libraries in C#
  13. GitHub - yowko/html-agility-pack-demo