文字コード
さて、現状のプログラムには1つ問題が残っています。実際に実行してみると、取得してきたページのソースコードが文字化けしています。
文字コードを正しく認識できていないのが原因ですね。xbox.comのページで文字コードを確認してみると、UTF-8になっています。
そこで、今度は「WebClient 文字コード」でBingってみてください。「WebClientクラスのEncodingプロパティで文字コードの指定が必要らしい」ということが分かるかと思います。
このことを踏まえて、早速プログラムを修正してみましょう。
これで、以下のように、正しくソースコードが表示されるようになりました。
情報抽出
![]() |
C#たん:
HTMLのソースコードを拾ってこれたことですし、今度はゲームのタイトル情報を抽出してみましょう。 文字列のパターンマッチングという処理になります。 |
![]() |
C++たん:
正規表現を使うのかしら? |
![]() |
ですね。でも、いい加減、正規表現って呼び方どうにかして欲しいですよね。Bingってみると「正規言語を表現するのに十分な文法」だとかなんとか出てきますけども、そういわれてパターンマッチングを想像できる人がどれだけいるんでしょうね。
|
![]() |
VBたん:
しかも、今となっては正規言語の範囲超えてるものねー。“正規”表現と言いつつ、色々拡張されちゃってて。 |
抽出対象
さて、その正規表現の話の前に、情報抽出の対象となるxbox.comのHTMLソースコードを見てみましょう。IEのソースコード表示機能を使ってみてみると、以下のようになっています。
ゲームのタイトルに関する部分を抜き出すと、以下のような感じです。
<a href="/ja-JP/Product/%E3%82%A2%E3%82%A4%E3%83%89%E3%83%AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%EF%BC%92/66acd000-77fe-1000-9115-d8024e4d0817">アイドルマスター2</a>
これを抽出するためのパターンを考えると、以下のようなものになります。
正規表現
やっぱりまずはBingりましょう(ググるのでも可)。「C# 文字列検索」とかで検索してもらうと、「正規表現」って言葉がちらほら見てとれるかと思います。そしてそこには、「Regexクラスを使え」と書かれているはずです。
正規表現自体は今回の主題ではないので、ここではいくつか参考記事を挙げるだけにとどめておきましょう。
先ほどの、ゲームのタイトルを抽出するためのパターンも、ここでは結果だけ書いてしまいましょう。以下のようになります。
/ja-JP/Pro[^"]*"\>(?<title>.*)\</a
ぱっと見は何か意味の解らない文字の羅列になっていますが、以下のように解釈してください。
ここで、正規表現に関連して、便利なサイトを1つ紹介しておきましょう。
このサイトでは、その場でリアルタイムに結果を見ながら正規表現を書いていくことができ、作った正規表現の共有も可能です。
このサイトで例えば、「検索文字列」のところに先ほど示したパターンを、「入力テキスト」のところにxbox.comのゲーム一覧ページのソースコードを入れてみてください。以下のような結果が得られるはずです。
スクリーンショット中の右下の部分に抽出したタイトル一覧が表示されています。
情報抽出プログラムの作成
正規表現について一通り説明したところで、プログラムに反映させてみましょうか。
こちらもいくつか補足説明を入れていきましょう。
文字列
正規表現は文字列中に書く必要があって、@"" でくくった上で、" は "" と2つ重ねて書く必要があります。元々、
/ja-JP/Pro[^"]*"\>(?<title>.*)\</a
だったものは、C#コード中に埋め込む際には以下のようになります。
@"/ja-JP/Pro[^""]*""\>(?<title>.*)\</a"
コードスニペット
一覧の1つ1つに対して処理をするにはforeach文を使います。foreachという単語だけ入力した後、Tabキーを押せば、Visual Studioがひな形を作ってくれます。
このようなひな形生成機能をコードスニペット(code snippet)と呼びます。IntelliSenseとの組み合わせが非常に強力です(foreachという単語すらすべて打つ必要がなく、foreくらいまで打てばIntelliSenseが補完してくれます)。









