.NET TIPS WebBrowserコントロールによりWebページからリンクや画像を抽出するには?[2.0のみ、C#、VB]デジタルアドバンテージ 遠藤 孝信2007/12/20 |
|
|
WebページのHTMLからリンク文字列(およびそのURL)や画像のURLを抜き出したい場合、単純な方法としてはHTMLドキュメントをダウンロードし、正規表現などにより<A>タグや<IMG>タグを抜き出すことができる。しかしこの方法では、HTMLドキュメントの構造が複雑であった場合や、ページ作成者のタグの閉じ忘れなどまでに対応しようとすると非常に困難になる。
そんな場合には、.NET Framework 2.0の標準コントロールであるWebBrowserコントロール(System.Windows.Forms名前空間)を利用するとよい。これはIEの描画エンジンをコントロール化したもので、対象となるWebページをこのコントロールに表示させた時点でIEの描画エンジンがそのHTMLドキュメントを解析しているため、それに含まれる各HTML要素には、後述する.NET Frameworkのクラスを使って簡単にアクセスできる。
本来WebBrowserコントロールはWindowsアプリケーション上にWebページやHTMLで記述されたヘルプやドキュメントを表示させるためのものだが、GUIを持たないアプリケーションでもその機能は利用可能だ。本稿ではコンソール・アプリケーションからWebBrowserコントロールを使用し、指定されたWebページからリンク文字列を抜き出す方法を示す。
Webページからリンク文字列を抜き出すサンプル・プログラム
WindowsアプリケーションでWebBrowserコントロールにより単にWebページを表示する場合には、Visual StudioでフォームにWebBrowserコントロールを配置しておき、そのNavigateメソッドを呼び出すだけでよい(「TIPS:WindowsアプリケーションでWebページを表示するには?」参照)。
今回のケースでは、以下のような手順によりWebBrowserコントロールを使用し、Webページ内のHTML要素にアクセスする。
- WebBrowserコントロールをインスタンス化する
- NavigateメソッドによりWebページに移動する
- ページ取得が完了するのを待つ
- DocumentプロパティからHtmlDocumentオブジェクトを得る
- HtmlDocumentオブジェクトから各要素(HtmlElementオブジェクト)にアクセスする
ポイントとなるのは、3のページ取得完了を待つ処理が必要となる点だ(WebBrowserコントロールではページの取得は非同期に行われるため、Navigateメソッドの呼び出し自体はすぐに完了する)。
ここではまず、上記の手順を実装したサンプル・プログラムを示す。このプログラムはInsider.NETのトップ・ページに含まれるすべてのリンク文字列とそのURLを表示する。
| |
WebBrowserコントロールによりリンクを取得するC#のサンプル・プログラム(getlinks.cs) | |
| |
WebBrowserコントロールによりリンクを取得するVBのサンプル・プログラム(getlinks.vb) | |
プログラムの実行結果は次のようになる。
| |
上記サンプル・プログラムの実行結果例 |
このプログラムでは、WebBrowserコントロールをサブクラス化してNonDispBrowserクラスを作成している。NonDispBrowserクラスのNavigateAndWaitメソッドが、指定したWebページの取得を開始し、それが完了するまで待つメソッドである。
ページ取得完了を待つ処理
NavigateAndWaitメソッドでは、WebBrowserコントロールより継承したNavigateメソッドを呼び出してページ取得を開始した後、doneフラグがtrueになるまでApplication.DoEventsメソッド呼び出しのループによりページ取得が完了するのを待つ。
doneフラグをtrueにセットしているのは、ページ取得が完了したときにシステムにより呼び出されるOnDocumentCompletedメソッドである。
ただし、対象としているWebページにフレームが含まれている場合には、フレーム内容の取得が完了した場合にもこのOnDocumentCompletedメソッドが呼び出される。このためプログラムでは、そのときに取得が完了したURL(コードではe.Url)と最終的に取得したいURL(WebBrowserコントロールのUrlプロパティの値)が一致した場合にのみdoneフラグをtrueにしている。
しかしこの処理だけでは、ほかのURLにリダイレクトされるようなページの取得は正しく処理できない(WebBrowserコントロールのUrlプロパティの値がリダイレクト後のURLとなるため)。このため一定時間(上記のコードでは10秒間)内にdoneフラグがtrueにならない場合には強制的にループを抜けるようにしている。
ポップアップ・ウィンドウの抑制
今回はGUIを持たないアプリケーションでの使用を目的としているので、WebBrowserコントロールが別ウィンドウを開こうとするのを阻止しなければならない。これは、新しいウィンドウが開く直前にシステムにより呼び出されるOnNewWindowメソッドにおいて、メソッドのパラメータで渡されるCancelEventArgsオブジェクト(System.ComponentModel名前空間)のCancelプロパティにtrueをセットすることで可能となる。
また、デフォルトでは、対象となるWebページに実行エラーとなるスクリプト(JavaScriptのコードなど)が含まれている場合、スクリプト・エラーを示すダイアログが表示されてしまう。これを抑制するにはWebBrowseコントロールのScriptErrorsSuppressedプロパティをtrueにしておけばよい。
HtmlDocumentオブジェクトとHtmlElementオブジェクト
Webページの取得が完了すれば、そのHTMLドキュメントにはDocumentプロパティからアクセスできる。
HTMLドキュメントはHtmlDocumentオブジェクト(System.Windows.Forms名前空間)で表され、これはHTMLドキュメントに含まれる各HTML要素をHtmlElementオブジェクト(System.Windows.Forms名前空間)のコレクションとして保持している(このコレクションはHtmlElementCollectionクラス(System.Windows.Forms名前空間)により表される)。
HtmlElementクラスには親要素や子要素(のコレクション)を示すParentプロパティやChildrenプロパティがあり、HTMLドキュメントは1つのツリー構造で表現されている。このためツリー構造をたどりながら任意の要素にアクセスすることもできるが、特定のタグを持つ要素だけを列挙する場合には、HtmlDocumentオブジェクトのGetElementsByTagNameメソッドを使うのが便利だ。
GetElementsByTagNameメソッドのパラメータには「A」や「IMG」といったタグ名を文字列で指定して呼び出す(大文字小文字は区別されない)。これによりそのタグ名を持つHtmlElementオブジェクトのコレクションが取得でき、その各要素についてGetAttributeメソッドによりタグの属性値を、InnerTextプロパティによりそのタグ内に含まれるテキストを取得できる。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Windowsフォーム 処理対象:WebBrowserコントロール 使用ライブラリ:WebBrowserコントロール(System.Windows.Forms名前空間) 使用ライブラリ:CancelEventArgsクラス(System.ComponentModel名前空間) 使用ライブラリ:HtmlDocumentクラス(System.Windows.Forms名前空間) 使用ライブラリ:HtmlElementクラス(System.Windows.Forms名前空間) 使用ライブラリ:HtmlElementCollectionクラス(System.Windows.Forms名前空間) 関連TIPS:WindowsアプリケーションでWebページを表示するには? |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|