C#を使用してWebページのHTMLソースを取得する例
3487 ワード
最近、URLアドレスに基づいてWebページのソースコードを取得する機能を持つプロジェクトが行われています.ASP.NET(C#)では、Webソースを取得するにはいろいろな方法があるようですが、簡単なWebClientを勝手にやってみました.とても簡単です.しかし、後ろの非常に怒った問題が出てきました.それは中国語の文字化けしです.
よく研究すると、中国語のページはGB 2312とUTF-8の2つのコードにほかならない.次のコードがあります.
ちょっと説明しますが、ここではWebClientを使用してwcオブジェクトを作成しました(この名前はちょっと気まずいです).次にwcオブジェクトのDownloadDataメソッドを呼び出し、URL値を入力し、バイト配列を返します.デフォルトではGB 2312を使用してこのバイト配列を読み出し、文字列に変換します.ウェブソースコードの文字列からウェブページの符号化フォーマットの特徴文字を検索し、charset=「utf-8」のような情報を見つけて、現在のウェブページの符号化フォーマットを判断する.
GetCharsetという関数は、現在のWebページの符号化フォーマットを取得するために使用されます.具体的なコードは次のとおりです.
あまり上手に書いていないような気がして、まず我慢して使って、ほほほ.小編オリジナル、転載明記、ほほほ.
よく研究すると、中国語のページは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;
}
あまり上手に書いていないような気がして、まず我慢して使って、ほほほ.小編オリジナル、転載明記、ほほほ.