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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章