最近在做一個項目,其中一個功能是根據一個URL地址,擷取到網頁的原始碼。在ASP.NET(C#)中,擷取網頁原始碼貌似有很多種方法,我隨便搞了一個簡單的WebClient,非常簡單容易。但後面一個非常惱火的問題出來了,那就是中文的亂碼。
通過仔細研究,中文的網頁不外乎GB2312和UTF-8這兩種編碼。於是有了下面這段代碼:
/// <summary> /// 根據網址的URL,擷取原始碼HTML /// </summary> /// <param name="url"></param> /// <returns></returns> public static string GetHtmlByUrl(string url) { using (WebClient wc = new WebClient()) { try { wc.UseDefaultCredentials = true; wc.Proxy = new WebProxy(); wc.Proxy.Credentials = CredentialCache.DefaultCredentials; wc.Credentials = System.Net.CredentialCache.DefaultCredentials; byte[] bt = wc.DownloadData(url); string txt = System.Text.Encoding.GetEncoding("GB2312").GetString(bt); switch (GetCharset(txt).ToUpper()) { case "UTF-8": txt = System.Text.Encoding.UTF8.GetString(bt); break; case "UNICODE": txt = System.Text.Encoding.Unicode.GetString(bt); break; default: break; } return txt; } catch (Exception ex) { return null; } } }
稍微解釋一下,這裡使用了WebClient建立了一個wc對象(這命名有點尷尬了)。然後調用wc對象的DownloadData方法,傳入URL值,返回一個位元組數組。預設使用GB2312來讀取這個位元組數組,把它轉換成字串。從網頁原始碼的字串中尋找網頁的編碼格式的特徵字元,如找到charset="utf-8"這樣的資訊,來判斷當前網頁的編碼格式。
GetCharset這個函數就是來擷取當前網頁的編碼格式的,具體代碼如下:
/// <summary> /// 從HTML中擷取擷取charset /// </summary> /// <param name="html"></param> /// <returns></returns> public static string GetCharset(string html) { string charset = ""; Regex regCharset = new Regex(@"content=[""'].*\s*charset\b\s*=\s*""?(?<charset>[^""']*)", RegexOptions.IgnoreCase); if (regCharset.IsMatch(html)) { charset = regCharset.Match(html).Groups["charset"].Value; } if (charset.Equals("")) { regCharset = new Regex(@"<\s*meta\s*charset\s*=\s*[""']?(?<charset>[^""']*)", RegexOptions.IgnoreCase); if (regCharset.IsMatch(html)) { charset = regCharset.Match(html).Groups["charset"].Value; } } return charset; }
更多使用C#擷取網頁HTML源碼的例子相關文章請關注topic.alibabacloud.com!