- PR -

C# HTMLの取得方法別による良い所など

1
投稿者投稿内容
むーすけ
会議室デビュー日: 2008/08/03
投稿数: 6
投稿日時: 2008-08-07 00:10
先日質問したばかりなのですが、また質問させてもらいます。
お手数おかけいたしますが、どうぞよろしくお願いいたします。

C#でのHTMLの取得方法には何種類かあると思うのですが、
@Webブラウザを利用して、Navigate、Completedで取得
Aエンコードを指定して、StreamReader(res.GetResponseStream(),Encoding.GetEncoding("Shift_JIS")) で取得
※緑のバイク(http://homepage3.nifty.com/midori_no_bike/)様に載ってる方法です。

私は、HTMLから本文のみを抽出したく、
@の方法であれば
HtmlDocument doc = webBrowser1.Document;
bunnsyou = doc.Body.InnerText;
とすれば、簡単に本文のみになるので、@の方法を使っているのですが、Webブラウザが表示し終わる必要があるので時間がかかってしまいます。さらに、フレーム構造のページだとフレームに関与するコンテンツの個数分DocumentCompletedするということもわかりました。
Aの方法のほうが時間がかからないと思うのですが、Aで取得したHTMLから本文以外のタグとかをうまく消すことが出来ず、あきらめてしまいました。

@は、本文抽出は簡単だが、時間がかかる、フレームのページには注意が必要。
Aは、時間ははやいが、タグを消すのが大変。

というほかに、それぞれの良い所や悪い所があれば、教えてください。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2008-08-07 07:40
正規表現を使えばタグを消すのも大変じゃないと思います。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-08-07 11:15
引用:

むーすけさんの書き込み (2008-08-07 00:10) より:

Aの方法のほうが時間がかからないと思うのですが、Aで取得したHTMLから本文以外のタグとかをうまく消すことが出来ず、あきらめてしまいました。


こんな記事が。
http://www.atmarkit.co.jp/fdotnet/dotnettips/760ntidy/ntidy.html
むーすけ
会議室デビュー日: 2008/08/03
投稿数: 6
投稿日時: 2008-08-07 23:32
回答ありがとうございます。

引用:

burton999さんの書き込み (2008-08-07 07:40) より:
正規表現を使えばタグを消すのも大変じゃないと思います。



HTMLのタグは<〜>と</〜>の間だと思い、<.*?>で消せるかと思ったのですが、
スタイルシートを外部から呼び出すのではなく、中で宣言してる場合の、
body{

}
など、その他いろいろと残ってしまうものもあり、諦めてしまいました…。

むーすけ
会議室デビュー日: 2008/08/03
投稿数: 6
投稿日時: 2008-08-07 23:39
回答ありがとうございます。

引用:

rainさんの書き込み (2008-08-07 11:15) より:
こんな記事が。
http://www.atmarkit.co.jp/fdotnet/dotnettips/760ntidy/ntidy.html



やはり、パーサを利用してHTMLを解析したほうが良いのですかね…?
パーサというものをつい最近知ったばかりで、
今まで、正規表現でいろいろと試してみていたのですが上手くいかず、諦めてしまったのです…。
パーサを利用して、頑張ってみたいと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-08-08 08:27
ほかにはつぎのやりかたがあります。ご参考までに。

・WebBrowser を使うけど、「件名:WebBrowser の DocumentCompleted の発生タイミングが、画像のロードを待つので遅い」 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45336&forum=7 のようにする。単純には IE の設定で画像を使わないようにすればよいでしょう。
・「件名:WebClient で得た HTML を HtmlDocument で解析したいが WebBrowser がないと使えない?」 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45032&forum=7 のように MSHTML を使う。あるいはご紹介があったパーサー Html Agility Pack を使う。ただ、MSHTML を使っても内部的なパーサーの動作は WebBrowser を使うのとそれほど動きが違わないような感じがします(確証はないですが)。しかし HTML の文字列の取得は自分で WebClient/WebRequest などを使えるので、そのあたりを自分で高速化できるなどのメリットはたしかにあります。Html Agility Pack はサンプルを動かしてみたのですが、それ以上はちょっととっかかりが難しくて私はあいにくやっていません。
・たんに WebBrowser を複数インスタンス同時に使う。これはコントロールを5〜6個ペタペタ貼って、アプリケーションで簡単なプーリングをするだけで楽です。アプリケーションの側では別段マルチスレッドをほとんど意識する必要もありません。

あと思うことは、正規表現だと HTML タグが壊れていたときの挙動をどうするかで悩むかもしれません。これは種々のパーサーを使っても同様でしょう。その点、WebBrowser コントロールだと IE と同じ挙動をするはずなので、悩まなくてよいので楽でしょう。
むーすけ
会議室デビュー日: 2008/08/03
投稿数: 6
投稿日時: 2008-08-09 22:00
回答ありがとうございます。
引用:

unibonさんの書き込み (2008-08-08 08:27) より:

・WebBrowser を使うけど、「件名:WebBrowser の DocumentCompleted の発生タイミングが、画像のロードを待つので遅い」 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45336&forum=7
・「件名:WebClient で得た HTML を HtmlDocument で解析したいが WebBrowser がないと使えない?」 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45032&forum=7
HTML の文字列の取得は自分で WebClient/WebRequest などを使えるので、そのあたりを自分で高速化できるなどのメリットはたしかにあります。Html Agility Pack はサンプルを動かしてみたのですが、それ以上はちょっととっかかりが難しくて私はあいにくやっていません。
・たんに WebBrowser を複数インスタンス同時に使う。これはコントロールを5〜6個ペタペタ貼って、アプリケーションで簡単なプーリングをするだけで楽です。アプリケーションの側では別段マルチスレッドをほとんど意識する必要もありません。

あと思うことは、正規表現だと HTML タグが壊れていたときの挙動をどうするかで悩むかもしれません。これは種々のパーサーを使っても同様でしょう。その点、WebBrowser コントロールだと IE と同じ挙動をするはずなので、悩まなくてよいので楽でしょう。



作成しているプログラムの目的上、なるべく時間をかけずに処理がしたいのですが、たたしかに、HTMLタグが壊れている可能性もあるので、正規表現やパーサを使ってもうまくいかない可能性が出てきてしまいますね…。
お恥ずかしいことに、WebBrowser を複数インスタンス同時に使うというのは、思いつきもしませんでした…。

参考として教えていただいたページに一通り目を通したのですが、正直に申しますと、C#を勉強し始めたばかりの私には、初めて見る単語も多く、理解するのに時間がかかってしまいそうでした…。
しかし、それは自分の勉強不足故なので、しっかりと理解できるよう勉強し、参考として教えていただいたページがちゃんと参考として使えるように精進したいと思います。

本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)