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