zoukankan      html  css  js  c++  java
  • HtmlAgilityPack --解析Html源码

     最近项目需要从网络上抓取一下数据解析Html源码,奈何正则表达式难写,于是网上搜索找到了“ HtmlAgilityPack”类库,敏捷开发,果然效率非同寻常。

     在此做笔记,写下心得,顺便给自己总结一下。

     1、 HtmlAgilityPack使用的是XPath进行路径搜索,如果对XML路径搜索很熟悉,用起来会得心应手

    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <bookstore>
    
    <book>
      <title lang="eng">Harry Potter</title>
      <price>29.99</price>
    </book>
    
    <book>
      <title lang="eng">Learning XML</title>
      <price>39.95</price>
    </book>
    
    </bookstore>
    View Code
    /bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
    /bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
    /bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
    /bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
    //title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
    //title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
    /bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
    /bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

    2、HtmlAgilityPack基本用法:

      最常使用的方法:SelectNodes (XPath)、 SelectSingleNode(XPath) 、

      CreateNode(HtmlNode.OuterHtml)(该方法通常用在查询完的结果再次进行分析,无法从查询出来的节点进行操作,查询是对大节点树的操作),一般用法

     其流程一般是先获取HTML,这个可以通过HtmlDocument的Load()或LoadHtml()来加载静态内容,或者也可以HtmlWeb的Get()或Load()方法来加载网络上的URL对应的HTML。(此方法我还没尝试,不知道是否能够加载网络上的方法)
     得到了HtmlDocument的实例之后,就可以用HtmlDocument的DocumentNode属性,这是整个HTML文档的根节点,它本身也是一个HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多个HtmlNode的集合对象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回单个HtmlNode。

    我从网站获取数据用WebClient、WebRequest、WebResponse 简单协议(Http、ftp)请求,基本满足项目要求:

    常用的属性:InnerHtml  InnerText   OuterHtml

                /// <summary>
            /// 通过Stream流下载Html源码
            /// </summary>
            /// <param name="Url"></param>
            /// <returns></returns>
            public static string DownLoadHtmlCode(string Url)
            {
                string HtmlCode = "";
                if (string.IsNullOrEmpty(Url)) return "";
                WebClient client = new WebClient();
                Stream stream=  client.OpenRead(Url);
                StreamReader sr = new StreamReader(stream);
                HtmlCode = sr.ReadToEnd();
                sr.Close();
                stream.Close();
                client.Dispose();
                return HtmlCode;
    
            }

                       HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.HtmlDocument();
                        //加载Html文档
                         hd.LoadHtml(DownLoadHtmlCode("http://www.baidu.com")); 

                          //以下是从代码里面截取部分信息

    HtmlNode strHtml = null;
    foreach (var item in hd.DocumentNode.SelectNodes("//*[@id='header']"))
    {
    //解析品牌
    strHtml = HtmlNode.CreateNode(item.OuterHtml);
    Project.Brand = strHtml.SelectSingleNode("//a[last()-1]").InnerText.Replace("移动手机", "").Replace("手机", "") + "<br/>";
    }

     3、删除样式、脚本、脚本注释

        从密密麻麻的源码中查找有效的源码信息,删除样式、脚本、脚本注释,解析获取innerHtml,装载到泛型变量,进行二次操作(输出页面、数据库存储)

      //去掉脚本标签和内容
                    if (hd.DocumentNode.SelectNodes("//script")!=null)
                    {
                        foreach (var script in hd.DocumentNode.SelectNodes("//script"))
                            script.Remove();
                    }
                
                    //去掉样式标签和内容
                    if (hd.DocumentNode.SelectNodes("//style")!=null)
                    {
                        foreach (var style in hd.DocumentNode.SelectNodes("//style"))
                            style.Remove();
                    } 
                   
    
                    //去掉注释标签和内容
                    if (hd.DocumentNode.SelectNodes("//comment()")!=null)
                    {
                        foreach (var comment in hd.DocumentNode.SelectNodes("//comment()"))
                            comment.Remove();//新增的代码
                    }
    View Code

     总结:

      HtmlAgilityPack 工具能够快速上手,而且是开源的,能够满足解析Html源码需求。

  • 相关阅读:
    Abp Zero 演示(链接)
    阿里中台战略是个伪命题(转)
    AlphaFlow智能BPM专家的博客
    绵绵用力方能久久为功 --《工程建设企业管理信息化实用案例精选》前言 -- 鲁贵卿
    业务梳理优化(政府、企业)---- 收集网上资料链接
    .NET for Apache® Spark™ 开源大数据分析工具
    Net Core 3.0 及 AspNet 3.0
    统一身份访问管理平台 (收集)-- Identity Access management platform
    SciSharp .Net 平台的人工智能,Net 如何调用 Python
    Identity Server4 及 其它 OpenId 服务器 学习
  • 原文地址:https://www.cnblogs.com/yudeyinji/p/3868920.html
Copyright © 2011-2022 走看看