1. 程式人生 > >c#使用 HtmlAgilityPack來進行抓取和解析來獲得table表格資訊

c#使用 HtmlAgilityPack來進行抓取和解析來獲得table表格資訊

專案上要用到抓取網頁,最後選用了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資訊,用哪個要分情況