zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    我的暑假周记2018.7.21
    大道至简读后感
    我的暑假周记2018.7.15
    继承与多态
    java联级调用
    古罗马凯撒大帝字串加密
    作业三
    线性同余法产生1000个随机数
    Text2
    java登录界面
  • 原文地址:https://www.cnblogs.com/daretodream/p/1795484.html
Copyright © 2011-2022 走看看