環境: Visual Studio 2010 / WPF
インターネット上のHTMLより、リンクや文書を取得するには、単にWebClient でHTMLを取って来て、処理すればいいのですが・・・
とある理由でHTMLをブラウズしながら、ドキュメントに含まれるリンクなどを取得する必要があったので、WebBrowser を使って作ってみました。
WebBrowser は、裏側で mshtml の COMで実装されているので、ちょっと使い方が面倒だったのでメモしておきます。
参照の追加より、COM のmshtml.tlb を追加する。
WebBrowserに対して、Navigate でブラウズする。
Navigated イベントだと、document を完全に取得する前に、Navigated イベントが発生してしまう。
そこで、Document が完全にロードを完了したイベントとして、LoadCompleted を使用する。
例1: innterTextを取得する場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
<span class="kwrd">private</span> <span class="kwrd">void</span> Window_Loaded(<span class="kwrd">object</span> sender, RoutedEventArgs e) { <span class="kwrd">this</span>.webBrowser1.LoadCompleted += <span class="kwrd">new</span> System.Windows.Navigation.LoadCompletedEventHandler(webBrowser1_LoadCompleted); } <span class="kwrd">void</span> webBrowser1_LoadCompleted(<span class="kwrd">object</span> sender, System.Windows.Navigation.NavigationEventArgs e) { <span class="kwrd">if</span> (webBrowser1.Document == <span class="kwrd">null</span>) <span class="kwrd">return</span>; mshtml.IHTMLDocument2 doc2 = (IHTMLDocument2)webBrowser1.Document; <span class="kwrd">this</span>.textBox2.Text = doc2.body.innerText; } <span class="kwrd">private</span> <span class="kwrd">void</span> button1_Click(<span class="kwrd">object</span> sender, RoutedEventArgs e) { <span class="kwrd">string</span> url = <span class="kwrd">this</span>.textBox1.Text; <span class="kwrd">this</span>.webBrowser1.Navigate(url); } |
例2: リンクの HTML をリストする場合
|
<span class="kwrd">void</span> webBrowser1_LoadCompleted(<span class="kwrd">object</span> sender, System.Windows.Navigation.NavigationEventArgs e) { <span class="kwrd">if</span> (webBrowser1.Document == <span class="kwrd">null</span>) <span class="kwrd">return</span>; mshtml.IHTMLDocument2 doc2 = (IHTMLDocument2)webBrowser1.Document; <span class="kwrd">foreach</span> (mshtml.IHTMLElement elem <span class="kwrd">in</span> doc2.links) { <span class="kwrd">this</span>.textBox2.Text += ((mshtml.IHTMLAnchorElement)elem).href + Environment.NewLine; } } |
実際の実行結果はこんな感じ。