zoukankan      html  css  js  c++  java
  • HtmlAgilityPack

    下面列出了最有用的路径表达式:
     nodename:选取此节点的所有子节点。 
     /:从根节点选取。 
     //:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 
     .:选取当前节点。 
     ..:选取当前节点的父节点。
     例如有下面一段XML:
     

    1. <?xml version="1.0" encoding="utf-8"?> 
    2.  <Articles
    3.  <Article
    4.    <Title>在ASP.NET中使用Highcharts js图表</title
    5.    <Url>http://zhoufoxcn.blog.51cto.com/792419/537324</Url
    6.    <CreateAt type="en">2011-04-07</price
    7.  </Article
    8.  <Article
    9.    <Title lang="eng">Log4Net使用详解(续)</title
    10.    <Url>http://blog.csdn.net/zhoufoxcn/archive/2010/11/23/6029021.aspx</Url
    11.    <CreateAt type="zh-cn">2010年11月23日</price
    12.  </Article
    13.  <Article
    14.    <Title>J2ME开发的一般步骤</title
    15.    <Url>http://blog.csdn.net/zhoufoxcn/archive/2011/06/12/6540223.aspx</Url
    16.    <CreateAt type="zh-cn">2011年06月12日</price
    17.  </Article
    18.  <Article
    19.    <Title lang="eng">PowerDesign高级应用</title
    20.    <Url>http://zhoufoxcn.blog.51cto.com/792419/166415</Url
    21.    <CreateAt type="zh-cn">2007-09-08</price
    22.  </Article
    23.  </Articles


      针对上面的XML文件,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
     /Articles/Article[1]:选取属于Articles子元素的第一个Article元素。 
     /Articles/Article[last()]:选取属于Articles子元素的最后一个Article元素。 
     /Articles/Article[last()-1]:选取属于Articles子元素的倒数第二个Article元素。 
     /Articles/Article[position()<3]:选取最前面的两个属于 bookstore 元素的子元素的Article元素。 
     //title[@lang]:选取所有拥有名为lang的属性的title元素。 
     //CreateAt[@type='zh-cn']:选取所有CreateAt元素,且这些元素拥有值为zh-cn的type属性。 
     /Articles/Article[Order>2]:选取Articles元素的所有Article元素,且其中的Order元素的值须大于2。 
     /Articles/Article[Order<3]/Title:选取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值须小于3。
     
     HtmlAgilityPack API简明介绍
     在HtmlAgilityPack中常用到的类有HtmlDocument、HtmlNodeCollection、
    HtmlNode和HtmlWeb等。
     其流程一般是先获取HTML,这个可以通过HtmlDocument的Load()或LoadHtml()来加载静态内容,或者也可以HtmlWeb的Get()或Load()方法来加载网络上的URL对应的HTML。
     得到了HtmlDocument的实例之后,就可以用HtmlDocument的DocumentNode属性,这是整个HTML文档的根节点,它本身也是一个HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多个HtmlNode的集合对象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回单个HtmlNode。

    using System;  
     using System.Collections.Generic;  
     using System.Text;  
     using HtmlAgilityPack;  
     using System.Text.RegularExpressions;  
       
     namespace CrawlPageApplication  
     {  
         /**  
          * 作者:周公  
          * 日期:2011-06-23  
          * Blog: http://blog.csdn.net/zhoufoxcn or http://zhoufoxcn.blog.51cto.com  
          * Weibo: http://weibo.com/zhoufoxcn  
          */ 
         public class CSDN_Parser  
         {  
             private const string CategoryListXPath = "//html[1]/body[1]/div[1]/div[1]/div[2]/div[1]/div[1]/dl[1]/dd[3]/div[1]/ul[1]/li";  
             private const string CategoryNameXPath = "//li[1]/a[2]";  
       
             /// <summary>  
             /// 分析博客首页  
             /// </summary>  
             /// <param name="url"></param>  
             /// <returns></returns>  
             public static List<Category> ParseIndexPage(string url)  
             {  
                 Uri uriCategory=null;  
                 List<Category> list = new List<Category>(40);  
                   
                 HtmlDocument document = new HtmlDocument();  
        //注意,这里省略掉了使用本人其它类库中加载URL的类,而是直接加载本地的HTML文件  
                 //string html = HttpWebUtility.ReadFromUrl(url, Encoding.UTF8);  
                 //document.LoadHtml(html);  
                 document.Load("CSDN_index.html", Encoding.UTF8);  
                 HtmlNode rootNode = document.DocumentNode;  
                 HtmlNodeCollection categoryNodeList = rootNode.SelectNodes(CategoryListXPath);  
                 HtmlNode temp = null;  
                 Category category = null;  
                 foreach (HtmlNode categoryNode in categoryNodeList)  
                 {  
                     temp = HtmlNode.CreateNode(categoryNode.OuterHtml);  
                     category = new Category();  
                     category.Subject = temp.SelectSingleNode(CategoryNameXPath).InnerText;  
                     Uri.TryCreate(UriBase, temp.SelectSingleNode(CategoryNameXPath).Attributes["href"].Value, out uriCategory);  
                     category.IndexUrl = uriCategory.ToString();  
                     category.PageUrlFormat=category.IndexUrl+"?PageNumber={0}";  
                     list.Add(category);  
                     Category.CategoryDetails.Add(category.IndexUrl, category);  
                 }  
                 return list;  
             }  
       
         }  
     } 
    using System;  
     using System.Collections.Generic;  
     using System.Text;  
     using HtmlAgilityPack;  
     using System.Text.RegularExpressions;  
       
     namespace CrawlPageApplication  
     {  
         /**  
          * 作者:周公  
          * 日期:2011-06-23  
          * Blog: http://blog.csdn.net/zhoufoxcn or http://zhoufoxcn.blog.51cto.com  
          * Weibo: http://weibo.com/zhoufoxcn  
          */ 
         public class CTO_Parser  
         {  
             private static Encoding PageEncoding = Encoding.GetEncoding("gb2312");  
             private static readonly Uri UriBase = new Uri("http://zhoufoxcn.blog.51cto.com");  
             private static string CategoryListXPath = "/html[1]/body[1]/div[5]/div[1]/div[1]/div[2]/ul[1]/li";  
             private static string CategoryNameXPath = "/li[1]/a[1]";  
       
             /// <summary>  
             /// 分析博客首页  
             /// </summary>  
             /// <param name="url"></param>  
             /// <returns></returns>  
             public static List<Category> ParseIndexPage(string url)  
             {  
                 Uri uriCategory = null;  
                 List<Category> list = new List<Category>(40);  
       
                 HtmlDocument document = new HtmlDocument();  
                 //string html = HttpWebUtility.ReadFromUrl(url, PageEncoding);  
                 //document.LoadHtml(html);  
                 document.Load("51cto_index.html", PageEncoding);  
                 HtmlNode rootNode = document.DocumentNode;  
                 HtmlNodeCollection categoryNodeList = rootNode.SelectNodes(CategoryListXPath);  
                 HtmlNode temp = null;  
                 Category category = null;  
                 foreach (HtmlNode categoryNode in categoryNodeList)  
                 {  
                     temp = HtmlNode.CreateNode(categoryNode.OuterHtml);  
                     if (temp.SelectSingleNode(CategoryNameXPath).InnerText != "全部文章")  
                     {  
                         category = new Category();  
                         category.Subject = temp.SelectSingleNode(CategoryNameXPath).InnerText;  
                         Uri.TryCreate(UriBase, temp.SelectSingleNode(CategoryNameXPath).Attributes["href"].Value, out uriCategory);  
                         category.IndexUrl = uriCategory.ToString();  
                         category.PageUrlFormat = category.IndexUrl + "/page/{0}";  
                         list.Add(category);  
                         Category.CategoryDetails.Add(category.IndexUrl, category);  
                     }  
                 }  
                 return list;  
             }  
         }  
     } 


     

  • 相关阅读:
    第二次作业循环语句
    c语言01次作业分支,顺序结构
    PAT 1027. Colors in Mars
    PAT 1026 Table Tennis
    PAT 1035 Password
    PAT 1038. Recover the Smallest Number
    PAT 1028 List Sorting (25)
    PAT 1041 Be Unique (20)
    PAT 1025 PAT Ranking
    1037. Magic Coupon
  • 原文地址:https://www.cnblogs.com/muxueyuan/p/4505313.html
Copyright © 2011-2022 走看看