...または、記念日情報を取得する
初めに
Webには、Wikipedia を始め様々な情報の宝庫です。でも、その中から必要な情報を探し出すとには、工夫が要ります。とはいえ、Wikipedia等のように決まった形で情報が書き込まれているPageからは、意外と簡単に情報が取り出せます。
以下、その紹介です。
Webページから、html を取り出す
.NET Framework でWebを参照するには、二つの方法があります。WebClientとWebBrowserです。今回は、WebClientを使います。
System::Net::WebClient^ web = gcnew System::Net::WebClient(); web->Encoding = Encoding::GetEncoding(L"UTF-8");
UTF-8なら、エンコードの指定は要らなそうですが、指定しておいた方が無難です。
この web に url を指定してhtmlを取り出します。
System::IO::Stream^ st = web->OpenRead(urlStr); System::IO::StreamReader^ sr = gcnew System::IO::StreamReader(st); String^ html = sr->ReadToEnd(); sr->Close();
変数urlStr は、文字列で"http://ja.wikipedia.org/wiki/"のようなurl文字列が入ります。
また、上記内容は、次のように書けます。
String^ html = web->DownloadString(urlStr);
こちらの方が簡単ですが、文字エンコード指定は、必須です。ご注意を。
また、WebClientのメソッドには、DownloadFileとか、色々あります。こちらを参照して下さい。
必要な情報を検索する
文字列htmlから、必要な情報を取り出します。
html記述が定型であることを前提にして、注目したい情報のタグを検索して抜き出します。
今回は、Wikipediaのカレンダー情報から記念日情報を取り出します。
String^ preStr = "年中行事</span></h2>"; String^ postStr = "<h2>"; String^ wiki = html->Substring(html->IndexOf(preStr)); wiki = wiki->Substring(preStr->Length, wiki->IndexOf(postStr) - preStr->Length);
そして、表示用に加工します。
array<String^> ^annis = wiki->Split('\n'); String^ str = ""; for each (String^ oneSnt in annis) { if ((oneSnt->IndexOf("<li>") == 0) || (oneSnt->IndexOf("<dt>") == 0) || ((oneSnt->IndexOf("<p>") == 0) && (oneSnt->IndexOf("<p><a name") < 0))) str = str + "・" + removeTag(oneSnt) + "\r\n"; else if (oneSnt->IndexOf("<dd>") == 0) str = str + " " + removeTag(oneSnt) + "\r\n"; else if (oneSnt->IndexOf("</li>") == 0) str = str + "\r\n"; }
中で使用している関数removeTag は、文字通り、tag文字を取り除きます。
String^ removeTag (String^ str) { return replaceRegex("<[^>]+>", str, ""); }
関数replaceRegexは、正規表現を使って文字列を置き換える関数です。こちらを参照して下さい。
正規表現の表すところは、『'<' と '>' で囲まれ、'>' 以外の1文字以上の文字を含むもの』といったところでしょうか。 今回のサンプルプログラムを実行すると、右の図のようなウィンドウが現れ、カレンダー内の適当な日をクリックすると、その日の記念日情報がテキスト・ボックスに表示されます。
サンプルの実行ファイルとソース(wikiAnniversary.lzh)は、こちらからどうぞ。
プログラム作製に使ったツールは、Visual C++ 2008 Express Edition 日本語版です。レジストリ等は使用していませんので、適当なフォルダに実行ファイル(wikiAnniversary.exe)を解凍すれば使えます。なおプログラムの実行に際しては、以下のモジュールが必要です。必要に応じてインストールして下さい。
Microsoft .NET Framework Version 2.0 再頒布可能パッケージ (x86)Microsoft .NET Framework 2.0 Service Pack 1 (x86)Microsoft Visual C++ 2008 再頒布可能パッケージ (x86) なお、掲載したソースおよび実行ファイルは、ご自由にお使い下さい。ただし、ご使用により、いかなる弊害や不具合が生じたとしても、当方ではいかなる責任も持ちません。予め、ご了承下さい。