[C#] 使用 HtmlAgilityPack 來採集網頁

因為工作需求,所以必須寫一隻小程式來擷取網頁資料,上網Google了一下於是找到了一個好用的套件HtmlAgilityPack,可以迅速的過濾HTML標籤,取得網頁資料。

 

  1. 從NuGet安裝<code>HtmlAgilityPack 

01

  1. 讀取網頁(以原價屋為例)
1
2
3
4
5
6
7
8

//指定來源網頁
WebClient url = new WebClient();
//將網頁來源資料暫存到記憶體內
MemoryStream ms = new MemoryStream(url.DownloadData("http://www.coolpc.com.tw/evaluate.php"));
//使用預設編碼讀入 HTML
HtmlDocument doc = new HtmlDocument();
doc.Load(ms, Encoding.Default);
  1. 原價屋除了商品的類型以外,類型內的選單(select)有做群組分類,為了要將分類與商品所以先建一個Model
1
2
3
4
5
6
7

class Product
{
public string type { get; set; }

public string name { get; set; }
}
  1. 判斷所要的商品類型(以CPU為例),再擷取該商品類型內選單的分類
1
2
3
4
5
6
7
8
9

var list_type = new List&lt;string&gt;();
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//select[@name='n4']//optgroup");

foreach (HtmlNode node in nodes)
{
var type = node.Attributes["label"].Value;
list_type.Add(type);
}
  1. 接下來就要該使擷取商品名稱與價格了
1
2
3
4
5
6

List&lt;string&gt; list_name = doc.DocumentNode.SelectSingleNode("//select[@name='n4']").InnerText.Split('\n').ToList();

//刪除不必要的非商品選項
list_name.RemoveRange(0,3);
list_name.RemoveAt(list_name.Count - 1);
  1. 將商品類型與名稱填入Model
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

var models = new List&lt;Product&gt;();
int number = 0;
for (int i = 0; i &lt; list_name.Count; i++)
{
string type = list_type[number];
string name = list_name[i];

if (name == "")
{
number++;
}
else
{
models.Add(new Product()
{
type = type,
name = name
});

Console.WriteLine("類型:{0} ,", type);
Console.WriteLine("名稱:{0}", name);
}
}

Console.ReadLine();
  1. 執行結果0000
     

範例程式:https://github.com/shuangrain/ConsoleApplication_HtmlAgilityPack

 

參考:[ASP.NET][C#]使用HtmlAgilityPack(1) 擷取網頁上的股票