c#使用 HtmlAgilityPack來進行抓取和解析來獲得table表格資訊
阿新 • • 發佈:2019-01-07
專案上要用到抓取網頁,最後選用了HtmlAgilityPack來進行。
官網地址:https://html-agility-pack.net/,可以看一下
基礎的:
// From File var doc = new HtmlDocument(); doc.Load(filePath); // From String var doc = new HtmlDocument(); doc.LoadHtml(html); // From Web var url = "http://html-agility-pack.net/"; var web = new HtmlWeb(); var doc = web.Load(url);
我要實現抓取某一個table的資訊,
官方程式碼如下:
HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>"); foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) { Console.WriteLine("Found: " + table.Id); foreach (HtmlNode row in table.SelectNodes("tr")) { Console.WriteLine("row"); foreach (HtmlNode cell in row.SelectNodes("th|td")) { Console.WriteLine("cell: " + cell.InnerText); } } }
這個例子是可以跑成功的,但是當我實際應用的時候會發現
table.SelectNodes("tr") 獲取的值為null,經查詢發現是路徑解析的問題,因為我獲取的html為
<table cellpadding="0" cellspacing="0" class="" width="100%"> <thead> <tr class="cantchoose"> <th width="10%">承運人</th> <th width="15%">航線名稱</th> <th width="10%">起運港</th> <th width="10%">目的港</th> <th width="54%">掛靠港</th> </tr> </thead> <tbody> <tr> <td title="ANL(澳航)">ANL(澳航)</td> <td title="Austrilian and Zelanian Line"> <a target="_blank" href="/chuanqibiao/company/shipline/74181">Austrilian and Zelanian Line</a> </td> <td title="YOKOHAMA">YOKOHAMA</td> <td title="BRISBANE">BRISBANE</td> <td title="YOKOHAMA-OSAKA-BUSAN-QINGDAO-SHANGHAI-NINGBO-XIAMEN-HONGKONG-KAOHSIUNG-MELBOURNE-SYDNEY-BRISBANE">YOKOHAMA-OSAKA-BUSAN-QINGDAO-SHANGHAI-NINGBO-XIAMEN-HONGKONG-KAOHSIUNG-MELBOURNE-SYDNEY-BRISBANE</td> </tr> <tr> <td title="ANL(澳航)">ANL(澳航)</td> <td title="Austrilian and Zelanian Line"> <a target="_blank" href="/chuanqibiao/company/shipline/74178">Austrilian and Zelanian Line</a> </td> <td title="YOKOHAMA">YOKOHAMA</td> <td title="BRISBANE">BRISBANE</td> <td title="YOKOHAMA-OSAKA-BUSAN-QINGDAO-SHANGHAI-NINGBO-XIAMEN-HONGKONG-KAOHSIUNG-MELBOURNE-SYDNEY-BRISBANE">YOKOHAMA-OSAKA-BUSAN-QINGDAO-SHANGHAI-NINGBO-XIAMEN-HONGKONG-KAOHSIUNG-MELBOURNE-SYDNEY-BRISBANE</td> </tr> </tbody> </table>
當前第一個tr的xml路徑為:/html[1]/body[1]/div[3]/div[3]/div[1]/table[1]/thead[1]/tr,最後 修改為:
table.SelectNodes(".//tr") 就可以解析這個table下面的所有tr資訊,
當使用
table.SelectNodes("//tr")時,獲取的是當前html的全部tr,如果當有兩個table時候,會獲取到兩個table全部的tr資訊,用哪個要分情況