C#对HTML文档的解析

相信很多人都有过HTML文档解析的需求。比如我们抓取了某1个网站的页面数据,格式就是HTML的格式。以前我们都是通过正则表达式来进行解析,但是发现有一些问题。解析HTML文档时并不容易,如果文档的格式稍有变化很可能就不能正确的匹配。因此我们需要专门的工具来帮助我们轻松的解析HTML文档。

其实已经有一个非常不错的工具提供了。比如HtmlAgilityPack。它可以帮助我们解析HTML文档就像用XmlDocument类来解析XML一样轻松、方便。

这个工具可以在http://htmlagilitypack.codeplex.com/下载到,里面有支持各种.NET Framework的版本的dll。

好了,下面提供一个足够Simple的例子给大家。大家可以在此基础之上,举一反三。

比如要解析下面的HTML。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <table>  
  2.     <thead>  
  3.         <tr>  
  4.             <th>时间</th>  
  5.             <th>类型</th>  
  6.             <th>名称</th>  
  7.             <th>单位</th>  
  8.             <th>金额</th>  
  9.         </tr>  
  10.     </thead>  
  11.     <tbody>  
  12.         <tr>  
  13.             <td>2013-12-29</td>  
  14.             <td>发票1</td>  
  15.             <td>采购物资发票1</td>  
  16.             <td>某某公司1</td>  
  17.             <td>123元</td>  
  18.         </tr>  
  19.         <tr>  
  20.             <td>2013-12-29</td>  
  21.             <td>发票2</td>  
  22.             <td>采购物资发票2</td>  
  23.             <td>某某公司2</td>  
  24.             <td>321元</td>  
  25.         </tr>  
  26.     <tbody>  
  27. </table>  

以控制台项目为例,首先要引用HtmlAgilityPack.dll文件,这样才能使用dll里面的类和方法。

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static void Main(string[] args)  
  2. {  
  3.     string strWebContent = @"<table><thead>  
  4.     <tr>  
  5.       <th>时间</th>  
  6.       <th>类型</th>  
  7.       <th>名称</th>  
  8.       <th>单位</th>  
  9.       <th>金额</th>  
  10.     </tr>  
  11.     </thead>  
  12.     <tbody>" +  
  13.     @"<tr>  
  14.       <td>2013-12-29</td>  
  15.       <td>发票1</td>  
  16.       <td>采购物资发票1</td>  
  17.       <td>某某公司1</td>  
  18.       <td>123元</td>  
  19.     </tr>" +  
  20.     @"<tr>  
  21.       <td>2013-12-29</td>  
  22.       <td>发票2</td>  
  23.       <td>采购物资发票2</td>  
  24.       <td>某某公司2</td>  
  25.       <td>321元</td>  
  26.     </tr>  
  27.     </tbody>  
  28.   </table>  
  29. ";  
  30.   
  31.     List<Data> datas = new List<Data>();//定义1个列表用于保存结果  
  32.   
  33.     HtmlDocument htmlDocument = new HtmlDocument();  
  34.     htmlDocument.LoadHtml(strWebContent);//加载HTML字符串,如果是文件可以用htmlDocument.Load方法加载  
  35.   
  36.     HtmlNodeCollection collection = htmlDocument.DocumentNode.SelectSingleNode("table/tbody").ChildNodes;//跟Xpath一样,轻松的定位到相应节点下  
  37.     foreach (HtmlNode node in collection)  
  38.     {  
  39.         //去除\r\n以及空格,获取到相应td里面的数据  
  40.         string[] line = node.InnerText.Split(new char[] { '\r''\n'' ' }, StringSplitOptions.RemoveEmptyEntries);  
  41.   
  42.         //如果符合条件,就加载到对象列表里面  
  43.         if (line.Length == 5)  
  44.             datas.Add(new Data() { 时间 = line[0], 类型 = line[1], 名称 = line[2], 单位 = line[3], 金额 = line[4] });  
  45.     }  
  46.   
  47.     //循环输出查看结果是否正确  
  48.     foreach (var v in datas)  
  49.     {  
  50.         Console.WriteLine(string.Join(",", v.时间, v.类型, v.名称, v.单位, v.金额));  
  51.     }  
  52. }  

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2. /// 定义的实体类用于接收数据  
  3. /// </summary>  
  4. public class Data  
  5. {  
  6.     public string 时间 { getset; }  
  7.     public string 类型 { getset; }  
  8.     public string 名称 { getset; }  
  9.     public string 单位 { getset; }  
  10.     public string 金额 { getset; }  
  11. }  

上面就是完整的代码,注释也很清楚。

最后看一下解析的结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值