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信息,用哪個要分情況 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM