C#を使用してWebページのHTMLソースを取得する例

3487 ワード

最近、URLアドレスに基づいてWebページのソースコードを取得する機能を持つプロジェクトが行われています.ASP.NET(C#)では、Webソースを取得するにはいろいろな方法があるようですが、簡単なWebClientを勝手にやってみました.とても簡単です.しかし、後ろの非常に怒った問題が出てきました.それは中国語の文字化けしです.
よく研究すると、中国語のページはGB 2312とUTF-8の2つのコードにほかならない.次のコードがあります.
 
  
       ///
       /// URL, HTML
       ///

       ///
       ///
       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値を入力し、バイト配列を返します.デフォルトではGB 2312を使用してこのバイト配列を読み出し、文字列に変換します.ウェブソースコードの文字列からウェブページの符号化フォーマットの特徴文字を検索し、charset=「utf-8」のような情報を見つけて、現在のウェブページの符号化フォーマットを判断する.
GetCharsetという関数は、現在のWebページの符号化フォーマットを取得するために使用されます.具体的なコードは次のとおりです.

         ///  
  
       /// HTML charset
       ///

       ///
       ///
       public static string GetCharset(string html)
       {
           string charset = "";
           Regex regCharset = new Regex(@"content=[""'].*\s*charset\b\s*=\s*""?(?[^""']*)", RegexOptions.IgnoreCase);
           if (regCharset.IsMatch(html))
           {
               charset = regCharset.Match(html).Groups["charset"].Value;
           }
           if (charset.Equals(""))
           {
               regCharset = new Regex(@"[^""']*)", RegexOptions.IgnoreCase);
               if (regCharset.IsMatch(html))
               {
                   charset = regCharset.Match(html).Groups["charset"].Value;
               }
           }
           return charset;
       }

あまり上手に書いていないような気がして、まず我慢して使って、ほほほ.小編オリジナル、転載明記、ほほほ.