项目上要用到抓取网页,最后选用了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信息,用哪个要分情况 

c#使用 HtmlAgilityPack来进行抓取和解析来获得table表格信息的更多相关文章

  1. 使用Python中的urlparse、urllib抓取和解析网页(一)(转)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  2. 网页调试技巧:抓取马上跳转的页面POST信息或者页面内容

    http://www.qs5.org/Post/625.html 网页调试技巧:抓取马上跳转的页面POST信息或者页面内容 2016/02/02 | 心得分享 | 0 Replies 有时候调试网页或 ...

  3. Python中的urlparse、urllib抓取和解析网页(一)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  4. 使用HtmlAgilityPack和ScrapySharp抓取网页数据遇到的几个问题解决方法——格式编码问题

    需要用到对应市区县街道居委会的区域编码,于是找到统计局的网页,对这些数据进行抓取,用到了HtmlAgilityPack和ScrapySharp,由于也是第一次从网页抓取数据,所以对于HtmlAgili ...

  5. c# 抓取和解析网页,并将table数据保存到datatable中(其他格式也可以,自己去修改)

    使用HtmlAgilityPack 基础请参考这篇博客:https://www.cnblogs.com/fishyues/p/10232822.html 下面是根据抓取的页面string 来解析并保存 ...

  6. Java HttpURLConnection 抓取网页内容 解析gzip格式输入流数据并转换为String格式字符串

    最近GFW为了刷存在感,搞得大家是头晕眼花,修改hosts 几乎成了每日必备工作. 索性写了一个小程序,给办公室的同事们分享,其中有个内容 就是抓取网络上的hosts,废了一些周折. 我是在一个博客上 ...

  7. Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息

    需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache. ...

  8. Android登录client,验证码的获取,网页数据抓取与解析,HttpWatch基本使用

    大家好,我是M1ko.在互联网时代的今天,假设一个App不接入互联网.那么这个App一定不会有长时间的生命周期,因此Android网络编程是每个Android开发人员必备的技能.博主是在校大学生,自学 ...

  9. 用python做网页抓取与解析入门笔记[zz]

    (from http://chentingpc.me/article/?id=961) 事情的起因是,我做survey的时候搜到了这两本书:Computational Social Network A ...

随机推荐

  1. RHEL7:如何配置I / O调度程序

    介绍 I / O调度程序用于优化磁盘上的读/写. RHEL 7中有三种类型的I / O调度程序(也称为I / O电梯): CFQ(C fullly F air Q ueuing)促进来自实时流程的I ...

  2. OtterTune来了,DBA怎么办

    https://blog.csdn.net/xiangzhihong8/article/details/72887476 最近AI的新闻特别多,席卷了围棋圈之后,成为了技术圈和媒体热捧的话题. 今天又 ...

  3. json格式转换(json,csjon)(天气预报)

    json格式数据默认为string,可以使用eval()函数或者json模块将其转换为dict.标准Json字符串必须使用双引号(")而不能使用单引号('),否则从字符串转换成dict类型会 ...

  4. Redis学习---Redis操作之有序集合

    有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序. zadd(name, *args, **kw ...

  5. opengl redbook Fatal Error in XXXXXX pixel format with necessary capabilities not found

    随便运行书中的一个程序aaindex.c时出现了下面的错误:pixel format with necessary capabilities not found 解决方法: http://www.ed ...

  6. SpringMVC框架项目在编译运行是常见错误

    1.问题描述(Spring_shizhan4ban_Chapter05应用):在自动注入FileValidator对象引用类型时报错,由于FileValidator是实体类,没有实现接口. @Auto ...

  7. C#综合揭秘——分部类和分部方法

    在面向对象的“封装闭合性”开发原则中,一向提倡的是把独立的功能封装在一个类里面的!但从Visual Studio 2005开发,系统提供了一个分部类的开发方式一直受到争议,很多人认为把同一类的功能分布 ...

  8. [EffectiveC++]item46:需要类型转换时请为模板定义非成员函数

  9. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  10. 第一次项目冲刺(Alpha版本)2017/11/14

    一.站立式会议 在宿舍进行了第一次会议 会议内容: 1.做了简单的分工 2.提出个人对任务是否有困难 3.规定完成时间在第三天之前 4.商量初步的代码规范 二.分工 三.任务分解图 四.燃尽图 五.数 ...