• C#抓取网页数据、分析并且去除HTML标签(转载)


    首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为String,以便于对其操作,实例如下:

    private static string GetPageData(string url)
    {
        if (url == null || url.Trim() == "")
            return null;
        WebClient wc = new WebClient();
        wc.Credentials = CredentialCache.DefaultCredentials;
        Byte[] pageData = wc.DownloadData(url);
        return Encoding.Default.GetString(pageData);//.ASCII.GetString
    }

    得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用):
    // 解析页面,查找链接
    // 此处尚需扩展,还有某些形式的链接不被识别
    string strRef = @"(href|HREF|src|SRC|action|ACTION|Action)[ ]*=[ ]*[""'][^""'#>]+[""']";
    MatchCollection matches = new Regex(strRef).Matches(strResponse);
    strStatus += "找到: "+matches.Count+" 个链接\r\n";

    上面的例子将网页中的链接解析出来,strRef变量表示了正则表达式的模式,变量matches表示符合匹配的项目的集合,后面的 Regex(strRef).Matches(strResponse)就是创建正则规则使得strResponse里符合strRef模式的字符串都返 回。然后调用matches的变量就可以取得各种信息了。
    当然,这里只能识别一些基本的链接形式,像script中的链接和一些不带“”的链接都没有被支持,这个的扩展还是比较简单的。

    常用的的解析还有以下几种:
    //获取标题
    Match TitleMatch = Regex.Match(strResponse, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    title = TitleMatch.Groups[1].Value;

    //获取描述信息
    Match Desc = Regex.Match(strResponse, "<Meta name=\"DESCRIPTION\" content=\"([^<]*)\">", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    strdesc = Desc.Groups[1].Value;

    //获取网页的大小
    size = strResponse.Length;

    //去除Html标签

    private string StripHtml(string strHtml)
    {
    Regex objRegExp = new Regex("<(.|\n)+?>");
    string strOutput = objRegExp.Replace(strHtml, "");
    strOutput = strOutput.Replace("<", "&lt;");
    strOutput = strOutput.Replace(">", "&gt;");
    return strOutput;
    }     
    有些例外会使得去除不干净,所以建议连续两次转化。这样将Html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句:
    //把所有空格变为一个空格
    Regex r = new Regex(@"\s+");
    wordsOnly = r.Replace(strResponse, " ");
    wordsOnly.Trim();

    第二种清除HTML的..我个人觉得不是很全面.不过也把它放上来..

    / <summary>
       /// 去除HTML标记
       /// </summary>
       /// <param name="strHtml">包括HTML的源码 </param>
       /// <returns>已经去除后的文字</returns>
       public static string StripHTML(string strHtml)
       {
        string [] aryReg ={
              @"<script[^>]*?>.*?</script>",

              @"<(\/\s*)?!?((\w+:)?\w+)(\w+(\s*=?\s*(([""'])(\\[""'tbnr]|[^\7])*?\7|\w+)|.{0})|\s)*?(\/\s*)?>",
              @"([\r\n])[\s]+",
              @"&(quot|#34);",
              @"&(amp|#38);",
              @"&(lt|#60);",
              @"&(gt|#62);",
              @"&(nbsp|#160);",
              @"&(iexcl|#161);",
              @"&(cent|#162);",
              @"&(pound|#163);",
              @"&(copy|#169);",
              @"&#(\d+);",
              @"-->",
              @"<!--.*\n"
             
             };

        string [] aryRep = {
               "",
               "",
               "",
               "\"",
               "&",
               "<",
               ">",
               " ",
               "\xa1",//chr(161),
               "\xa2",//chr(162),
               "\xa3",//chr(163),
               "\xa9",//chr(169),
               "",
               "\r\n",
               ""
              };

        string newReg =aryReg[0];
        string strOutput=strHtml;
        for(int i = 0;i<aryReg.Length;i++)
        {
         Regex regex = new Regex(aryReg[i],RegexOptions.IgnoreCase );
         strOutput = regex.Replace(strOutput,aryRep[i]);
        }

        strOutput.Replace("<","");
        strOutput.Replace(">","");
        strOutput.Replace("\r\n","");


        return strOutput;
       }

    转自:
    http://apps.hi.baidu.com/share/detail/5941615
  • 相关阅读:
    optparse--强大的命令行参数处理包
    B/S和C/S架构的区别
    Document
    Document
    Document
    Document
    Document
    Document
    Document
    Document
  • 原文地址:https://www.cnblogs.com/johnwonder/p/1909980.html
Copyright © 2020-2023  润新知