2013年9月11日 星期三

[轉貼] C#獲取網頁源碼並且自動判斷網頁字符集編碼


出處:http://archive.cnblogs.com/a/2019070/

最近開始打算重新學習C#,並且嘗試做點C#練習。而最讓我感興趣的還是和網站相關的東西。那就做個獲取網站源碼,採集文章的功能吧。
根據網上的資料,使用WebClient來獲取源碼,很容易就能得到網頁源碼。但是,發現,不同網站的網頁字符編碼就不一樣的,如何自動分別不同網 站的字符編碼,而正確解釋網頁中的漢字呢。在C#裡,提供了豐富的工具類庫,可以輕鬆的轉碼。但是,卻發現不能自動獲取網站上的字符編碼而自動正確的解釋 源碼,而導致漢字顯示亂碼。以前我也用JAVA做過這樣的功能,獲取網站源碼,同樣,在JAVA的各種獲取網站源碼的類庫裡,也不能自動根據網頁字符編碼 自動正確解釋編碼,只能我們自己手動來做了。
我的解決辦法是先採用系統默認的編碼從stream裡得到源碼,再使用正則表達式獲取源碼中的[獲取網頁字符編碼描述信息],這個信息,一般來說, 網頁裡都會有的,在網頁源碼的<head>裡,類似這樣的代碼:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />(其實不一樣完全這樣,有些不規範的,沒有雙引號,或者最後面沒有/閉合,所以,正則表達式得考慮周全些),從這個代碼裡來獲取編碼信息,再判 斷系統當前的默認編碼是否和這個一樣,如果不同,再使用網頁中取到的編碼來重新從stream裡解釋取得網頁源碼。
源碼如下:(下面這段代碼是一個完整的獲取網頁源碼,且自動正確解釋漢字)

using System.Net;using System.IO;using System.Text.RegularExpressions;//url是要訪問的網站地址,charSet是目標網頁的編碼,如果傳入的是null或者"",那就自動分析網頁的編碼
private string getHtml(string url, string charSet)
{
    
//創建WebClient實例myWebClient
    WebClient myWebClient = new WebClient();
    
// 需要注意的:
    
//有的網頁可能下不下來,有種種原因比如需要cookie,編碼問題等等
    
//這是就要具體問題具體分析比如在頭部加入cookie
    
// webclient.Headers.Add("Cookie", cookie);
    
//這樣可能需要一些重載方法。根據需要寫就可以了

    
//獲取或設置用於對向 Internet 資源的請求進行身份驗證的網絡憑據。
    myWebClient.Credentials = CredentialCache.DefaultCredentials;
    
//如果服務器要驗證用戶名,密碼
    
//NetworkCredential mycred = new NetworkCredential(struser, strpassword);
    
//myWebClient.Credentials = mycred;
    
//從資源下載數據並返回字節數組。(加@是因為網址中間有"/"符號)
    byte[] myDataBuffer = myWebClient.DownloadData(url);
    
string strWebData = Encoding.Default.GetString(myDataBuffer);

    
//獲取網頁字符編碼描述信息
    Match charSetMatch = Regex.Match(strWebData, "<meta([^<]*)charset=([^<]*)\"", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    
string webCharSet = charSetMatch.Groups[2].Value;
    
if (charSet == null || charSet == "")
    charSet 
= webCharSet;

    
if (charSet != null && charSet != "" && Encoding.GetEncoding(charSet) != Encoding.Default)
    strWebData 
= Encoding.GetEncoding(charSet).GetString(myDataBuffer);
    
return strWebData;
}

1 則留言: