Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357979
  • 博文数量: 76
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-21 22:30
文章分类
文章存档

2014年(38)

2013年(38)

分类: C#/.net

2014-01-02 17:41:40

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

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

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

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

比如要解析下面的HTML。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    

   
       
           
           
           
           
           
       
   
   
       
           
           
           
           
           
       
       
           
           
           
           
           
       
   
时间类型名称单位金额
2013-12-29发票1采购物资发票1某某公司1123元
2013-12-29发票2采购物资发票2某某公司2321元


以控制台项目为例,首先要引用HtmlAgilityPack.dll文件,这样才能使用dll里面的类和方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    
static void Main(string[] args)
{
    string strWebContent = @"
   
     
     
     
     
     
   
   
    " +
    @"
     
     
     
     
     
    " +
    @"
     
     
     
     
     
   
   
 
时间类型名称单位金额
2013-12-29发票1采购物资发票1某某公司1123元
2013-12-29发票2采购物资发票2某某公司2321元

";
           
    List datas = new List();//定义1个列表用于保存结果
           
    HtmlDocument htmlDocument = new HtmlDocument();
    htmlDocument.LoadHtml(strWebContent);//加载HTML字符串,如果是文件可以用htmlDocument.Load方法加载
           
    HtmlNodeCollection collection = htmlDocument.DocumentNode.SelectSingleNode("table/tbody").ChildNodes;//跟Xpath一样,轻松的定位到相应节点下
    foreach (HtmlNode node in collection)
    {
        //去除\r\n以及空格,获取到相应td里面的数据
        string[] line = node.InnerText.Split(new char[] { '\r', '\n', ' ' }, StringSplitOptions.RemoveEmptyEntries);
           
        //如果符合条件,就加载到对象列表里面
        if (line.Length == 5)
            datas.Add(new Data() { 时间 = line[0], 类型 = line[1], 名称 = line[2], 单位 = line[3], 金额 = line[4] });
    }
           
    //循环输出查看结果是否正确
    foreach (var v in datas)
    {
        Console.WriteLine(string.Join(",", v.时间, v.类型, v.名称, v.单位, v.金额));
    }
}
1
2
3
4
5
6
7
8
9
10
11
    
///
/// 定义的实体类用于接收数据
///

public class Data
{
    public string 时间 { get; set; }
    public string 类型 { get; set; }
    public string 名称 { get; set; }
    public string 单位 { get; set; }
    public string 金额 { get; set; }
}

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


阅读(2256) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~