原文
http://blog.csdn.net/xuexiaodong2009/article/details/7481122
其实这个内容本身没有什么实际价值,只是有段时间,自己想找所有下载分为0的资源,闲来没事就随手写了一个小程序,见识到了正则表达式的强大 1分析需求 2查找规律,实现思路,3实现代码
1分析需求    需求很简单,就是找到所有下载分为0的资源,也就是不需要下载分的资源,刚开始时自己手动一个一个的找,感觉太慢了,      首先得打开资源分类页http://download.csdn.net/category,      再打开某一分类例如android http://download.csdn.net/category/mobile_development/android,       再点列表的某一页 例如第2页,http://download.csdn.net/category/mobile_development/android/orderbypubdate/2,         一页六个资源,一个一个的看,是不是存在不需要下载分的资源,有就打开到资源的详细页面,     最后才可以到下载页面,实在感觉太慢了,于是就有了写一个小程序的想法。在50页中查找差不多得一个小时。  2查找规律,实现思路   有了想法就开始想着怎么实现了。第一步就是分析各个页面的关系或者说是规律。对于某一个具体的分类列表页的url组成是有三部分组成:       第一部分http://download.csdn.net/category/是固定的,       第二部分是mobile_development是资源的大分类,       第三部分是android小分类,       最后就是排序方式和页码了orderbypubdate/2     分析列表的网页的源代码,发现关键的一行,包含了资源详细信息的链接和下载分,     例如如下一行的链接为/detail/ipoints/4241887,下载分为1
[html] view plaincopy
<dt><a href="/detail/ipoints/4241887">Yaffs专家.apk</a><span class="s">1</span></dt>  
通过正则表达式就可以匹配到链接和下载分。 资源的详细介绍页面和最终下载页面也有一定的关系,一个是detail一个是download,所以只要得到了资源的详细介绍页面就可以了。http://download.csdn.net/detail/xuexiaodong2009/4241131http://download.csdn.net/download/xuexiaodong2009/4241131
3实现代码
获取资源列表页
[csharp] view plaincopy
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;  
          
            request.Method = "GET";  
            request.KeepAlive = false;  
            //Get the response  
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)  
            {  
                using (Stream responseStream = response.GetResponseStream())  
                {  
                    using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))  
                    {  
                        string line = reader.ReadLine();  
                        int count = 0;  
                        int lineNo = 0;  
                        while (line != null)  
                        {  
                            lineNo++;  
                            if (lineNo < startLineIndex || string.IsNullOrEmpty(line))  
                            {  
                                line = reader.ReadLine();  
                                continue;  
                            }  
  
                            if (lineNo >= endLineIndex)  
                            {  
                                break;  
                            }  
                            Match match = reDetailUrl.Match(line);  
                            if (match.Success)  
                            {  
                                string inerUrl = match.Groups["url"].Value;  
                                string s = match.Groups["s"].Value;                               
                            }  
                            line = reader.ReadLine();  
                        }  
                    }  
                }  
            }  匹配资源详细介绍URL的正则表达式,  [csharp] view plaincopy
<a\s+href\s*=\s*"(?<url>[^"]{1,})">[^<]{1,}\s*</a><span\s+class\s*=\s*"s"\s*>\s*(?<s>\d{1,})\s*</span>   实现效果,分析一类资源,也就不到十分钟,效果非常明显。 遗留问题:   本想通过程序自动下载资源,但没有找到通过CSDN下载资源前,先需要验证的方法,只能暂时放一放了。  希望有想法的可以给指点一下。
源代码下载地址
http://download.csdn.net/detail/xuexiaodong2009/4242746

解决方案 »

  1.   

    可现在还没想到自动下载前通过CSDN验证的方法,这些就无从谈起了
      

  2.   

    <a\s+href\s*=\s*"(?<url>[^"]{1,})">[^<]{1,}\s*</a><span\s+class\s*=\s*"s"\s*>\s*(?<s>\d{1,})\s*</span>  
    ============
    (?i)<a\b[^>]*?href\s*=([\s'"]?)(?<url>[^'"\s]+)\1>[^<>]+</a><span\b[^>]*?class\s*=([\s'"]?)s\2[^>]*?>\s*(?<s>\d+)\s*</span>  正则方面是否可优化一下成这样呢
      

  3.   

    Tim的正则这么好,如果也像过客一样写个系列就好了
      

  4.   

    应该是这个吧(?i)<a[^>]*?href\s*=([\s"]?)(?<url>[^"\s]+)\1>[^<>]+</a><span[^>]*?class\s*=([\s"]?)s\2[^>]*?>\s*(?<s>\d+)\s*</span>
      

  5.   

    不可忽视单引号,要考虑正则的健壮性
    有时也有可能出现这样的情况:
    <a href='url'>
    <a href="url">
    <a href=url>
      

  6.   

    -lminiSDL 
    -lminiSDL 
    -lminiSDL 
      

  7.   

    -lminiSDL 
    -lminiSDL 
    -lminiSDL 
      

  8.   

    给大家附上,BLog采集的正则吧,
    #region 数据分析相关正则
    /// <summary>
    /// 获取文章目录中文章的Url地息
    /// </summary>
    private Regex regArticleUrls = new Regex( @"<span class=""link_title"">[^<]*<a(?:(?!href).)*href\s*=\s*['""]?(?<url>[^'"">\s]*)['""]?", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline );
    /// <summary>
    /// 获取下一页的正则
    /// </summary>
    private Regex regNextPage = new Regex( @"<a(?:(?!href).)*href\s*=\s*['""]?(?<url>[^'"">\s]*)['""]?[^>]*>[^<]*下一页[^<]*</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline );
    /// <summary>
    /// 获取文章的属性
    /// </summary>
    private Regex regArticleInfo = new Regex( @"(?:<span class=""link_categories"">(?:[^<]*<a[^>]*>(?<tag>[^<]*)</a>)*[^<]*</span>)?[^<]*<span class=""link_postdate"">(?<publish>[^<]*)</span>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline );
    /// <summary>
    /// 获取文章正文
    /// </summary>
    private Regex regArticleContent = new Regex( "<div id=\"article_details\" class=\"details\">[^<]*<div class=\"article_title\">[^<]*(?:(?!<div id=\"side\">[^<]*<div class=\"side\">[^<]*<div id=\"panel_Profile\" class=\"panel\">).)*", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline );
    /// <summary>
    /// 去除评论内容正则
    /// </summary>
    private Regex regArticleRemoveFooter = new Regex( "(<div class=\"article_next_prev\">[^>]*<li class=\"prev_article\">(?:(?!</div>).)*</div>)[^$]*", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline );
    /// <summary>
    /// 文章标题
    /// </summary>
    private Regex regArticleTitle = new Regex( "<span class=\"link_title\">[^>]*>\\s*(?<title>(?:(?!</a>).)*)</a></span>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline );
    /// <summary>
    /// 获取图片
    /// </summary>
    private Regex regImages = new Regex( @"(<img(?:(?!src).)*src\s*=\s*([""']))(?<img>(?:(?!\2).)*)(\2[^>]*>)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline );
    #endregion
      

  9.   

    真佩服你的勇气。。
    这个帖子如果出现在豆豆,那么没问题关键是出现在了csdn。