2016年9月28日 星期三

[.NET] 使用HtmlAgilityPack與HAPXPathFinder擷取網頁上的資料

說明:
想擷取網頁上的資料,該怎麼做?

作法:
寫.NET的可以使用HtmlAgilityPack這個套件,可透過NuGet或自行下載後加入參考,
這裡以擷取統一發票中獎號碼為例(網址:http://invoice.etax.nat.gov.tw/)。

假設想擷取特別獎號碼,需要知道它的XPath,何謂XPath呢?
XPath(XML Path Languange),用來尋找XML檔案中的節點,詳細語法可參閱[1][2]。
一般而言,網頁的XPath大多像這樣:/html/body/div[1]/table[1]/tr[1]/td[1]。

找尋XPath主要有兩種方法:
● 檢視網頁原始碼來找尋XPath,或按F12開發者工具,再點選「選取元素」自行剖析XPath,Chrome可右鍵->Copy->Copy XPath。

● 使用HAPXPathFinder[3],曾自行剖析某網頁XPath,程式卻一直找不到該節點,使用HAPXPathFinder發現,該XPath沒有html tag...。因各瀏覽器產生的DOM有所差異,
使用HAPXPathFinder可以準確找出HtmlAgilityPack DOM的XPath。
打開HAPXPathFinder,在「Browser」tab輸入URL後,點選「DOM Tree」tab,
在TextBox輸入尋找內容->點選「Find」->點選右方Text區塊的搜尋結果
(->點選左方區塊的標示節點)->中間區塊即有節點的XPath(/#text[1]不需要)。如:


有了URL與XPath,就可以使用HtmlDocument.DocumentNode.SelectSingleNode方法的InnerText屬性來取得號碼了。 若找不到資料,可能是網頁編碼的問題,該網頁編碼使用UTF8。







參考資料:
[1] http://www.w3schools.com/xsl/xpath_syntax.asp
[2] https://msdn.microsoft.com/zh-tw/library/ms256086(v=vs.120).aspx
[3] https://hapxpathfinder.codeplex.com/