- - PR -
C#で、ウェブブラウザからHTMLの本文のみの抽出について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-08-03 21:42
お世話になります。
現在、WebBrowserに表示されたページのHTMLからbody本文のみをテキストファイルに出力するプログラムを作っているのですが、参照しているURLは違うのに同じ内容のテキストファイルが複数出来てしまったりと、苦戦しております…。 配列url[0〜9]に計10個のURLが入っているのですが、 int sUrl=0; webBrowser1.Navigate(url[sUrl]); private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (sUrl <= 9) { bunnsyou = ""; HtmlDocument doc = webBrowser1.Document; if (doc.Body.InnerText == null) { bunnsyou = " "; } else { bunnsyou = doc.Body.InnerText; } StreamWriter writer = new StreamWriter("text" + sUrl + ".txt"); writer.Write(bunnsyou); writer.Close(); sUrl++; webBrowser1.Navigate(url[sUrl]); } } と、まず配列url[0]から始めて、DocumentCompletedの中でまたNavigateしています。 本文がNULLであった場合は、空白を入れて、絶対10個のテキストを作るようにしております。 text7.txtとtext8.txtが、違うURLなので違うHTMLのはずなのに、同じ内容のテキストになってしまうということがおきてしまいます…。 Navigateを行うと、DocumentCompletedに行ってくれると思っているのですが、それが勘違いなのでしょうか…? ご指導のほど、よろしくお願いいたします。 | ||||
|
投稿日時: 2008-08-03 23:35
その認識で基本的には間違ってはいないません。しかし、フレーム(frame)構造になっていると、フレームに関与するコンテンツの個数分 DocumentCompleted が発生します。 もしかしたら、フレーム構造になっているページに Navigate しているのではないでしょうか?(良くは知りませんが iframe でもなるのかもしれません。) DocumentCompleted の引数 WebBrowserDocumentCompletedEventArgs の中に Url の情報が入っていますので、それで確認はできます。 ただ、WebBrowser の仕様はフレームの取り扱いのことをあまり考えてくれないようであり、アプリケーションできちんと処理しようとするとかなり苦労します。 「件名:WebBrowser コントロールを使用し、URL を見ずにどの frame かを識別することは可能ですか?」 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43920&forum=7 のような問題です。 | ||||
|
投稿日時: 2008-08-05 16:01
回答ありがとうございます。
確認してみたところ、フレーム構造で作られているページのURLも配列の中に含まれていました…。 事前に、 配列の中身のURLをリストボックスに表示して、クリックされたURLのHTMLの本文をテキストボックスに表示する。 という1個ずつの手動的な実験が上手くいっていたので、sUrl++で自動的に行ってくれるようにしてテキストファイルに出力も、出来るものだと思っていました…。 フレームに関与するコンテンツの個数分 DocumentCompleted が発生するということも知らず、まだまだ未熟者ですみませんでした…。 APIの検索結果上位10件を配列にいれているので、フレーム構造のページが含まれるかどうかは、その時によって違いますし、 その10件のURLのHTMLの本文のみをテキストファイルに出力しなければならないので、これからは、フレームにどう対応していくかということと闘うことになりそうです…。 unibonさん、とても早い回答、本当にありがとうございました。 |
1