DOBON.NET DOBON.NETプログラミング掲示板過去ログ

htmlの構文解析

  • 題名: htmlの構文解析
  • 著者: とっとことみん
  • 日時: 2007/02/19 14:02:40
  • ID: 19116
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[.NET Framework 2.0、C#]
分類:[.NET]

htmlの構文解析をするために、HTMLDocumentを利用しようと思っているのですが、このクラスはWebBrowserと連動しないと動作しないのでしょうか?

これ以外にhtmlの構文解析をおこなう方法はないのでしょうか?
具体的には
1.指定したタグ内のテキストを抽出する
例:<div class="title">ああああ</div>の「ああああ」部分
2.タグを指定するときは属性情報を指定することもある

よろしくお願いします。
とりあえず後半だけ。

> これ以外にhtmlの構文解析をおこなう方法はないのでしょうか?
> 具体的には
> 1.指定したタグ内のテキストを抽出する
> 例:<div class="title">ああああ</div>の「ああああ」部分

正規表現を使えば抽出できます。
System.Text.RegularExpressions 名前空間を調べてください。
特にRegexクラスのMatchメソッドとその戻り値のMatchクラスのGroupsプロパティ。

正規表現用の文字列は以下のような感じになると思います。
@"\<div class=\"title\"\>(.*)\</div\>"


> 2.タグを指定するときは属性情報を指定することもある

こちらは意味がよくわからなかったのですが、
<div>タグの内容が別のタグだったり、他の属性がついたりすることがある、
という意味合いなら、それも正規表現の工夫でなんとでもなると思います。
> 正規表現用の文字列は以下のような感じになると思います。
> @"\<div class=\"title\"\>(.*)\</div\>"

正規表現は最長一致なので

<div><div><div></div></div></div>

のような場合正しくマッチしないような気がします。
■No19120に返信(渋木宏明(ひどり)さんの記事)
>>正規表現用の文字列は以下のような感じになると思います。
>>@"\<div class=\"title\"\>(.*)\</div\>"
>
> 正規表現は最長一致なので
>
> <div><div><div></div></div></div>
>
> のような場合正しくマッチしないような気がします。

最初に一番外側にマッチしたとして、
<div><div><div></div></div></div>から外側の<div>タグを取った文字列で
さらに検索すれば、
<div><div></div></div>がマッチするでしょうし、同様に繰り返せば、
すべてのマッチを判断できると思います。

まだ、穴があったらご指摘ください。


>>とっとこみんさん
> HTMLDocumentを利用しようと思っているのですが、
> このクラスはWebBrowserと連動しないと動作しないのでしょうか?

ヘルプで確認しましたが、HTMLDocumentを単体で生成する方法がありませんね。
WebBrowserとの連動だと不都合があるのでしょうか?
例えば、ユーザに見えると良くないということなら、非表示にしておけば
よいように思いますので。
>最初に一番外側にマッチしたとして、

そのタグが「最も外側」であることを後から知るのは、かなり大変ですよね?
(はじめから HTML の文書構造が分かっていれば問題はありませんが)

ごく簡単な処理や切り出された HTML が対象の場合は有効ですが、HTMLDOM の完全な代替にはならないので、その辺の見極めは必要と思います。
■No19123に返信(渋木宏明(ひどり)さんの記事)
> >最初に一番外側にマッチしたとして、
>
> そのタグが「最も外側」であることを後から知るのは、かなり大変ですよね?
> (はじめから HTML の文書構造が分かっていれば問題はありませんが)
>
> ごく簡単な処理や切り出された HTML が対象の場合は有効ですが、HTMLDOM の完全な代替にはならないので、その辺の見極めは必要と思います。
>

渋木さんと私で何か認識が違っているなと思ったのですが、やっとわかりました。
渋木さんの回答は「htmlの構文解析を行い、汎用的に利用できる」ということを前提にした場合のものですね。

私は質問の内容から質問者さんのやりたいことは、「htmlの構文解析自体ではなく、ある前提条件の下に必要な情報をいくつか得たい」ということだと予想したので、
正規表現でも実現可能ではないかな?と予想しました。

渋木さんのご指摘の通り、前提条件を十分に付けられない場合は、
正規表現では実現は難しいかもしれません。

>よねKENさん、渋木宏明(ひどり) さん

ご意見ありがとうございます。
自分でもさらに調べて見たところ、IHTMLDocument2を使えばどうにかなるかと思ったのですが、html内に構文ミス(特にJavaScript系で)があると実行中にWindowsメッセージボックスが表示されるため使えません。出ないようにできれば良かったのですが。

また知り合いの人に以下のようなサイトも見つけたのですが、これはあくまでタグの中の属性情報取得であって私が求めているようなものではなかったです・・・(ちなみにこれ自体うまく動かないかも・・・といっていたし)。

Microsoft C#での HTML 構文解析
<http://japan.internet.com/developer/20051115/25.html >


正規表現も難しいとなると厳しいですね。
  • 題名: Re[7]: htmlの構文解析
  • 著者: よねKEN
  • 日時: 2007/02/20 22:49:59
  • ID: 19132
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
HTMLを解析して最終的に何をしたいのでしょうか?

先の投稿でも言っていますが、
前提条件をある程度、限定できるのであれば、
正規表現でも解決できるかもしれません。

> 正規表現も難しいとなると厳しいですね。

というところから、ある程度厳密な解析が必要な
内容が必要なのでしょうか。
> 正規表現も難しいとなると厳しいですね。

「出来ない」とは言っていません。
汎用的な使用には適してないと指摘しただけです。

要するに「どんなことをしたいのか」が重要なのです。

あるサイトの特定のページを解析する(=例:わんくま掲示板の記事一覧ページからRSSを生成する)とかなら、正規表現でも可能です。
>よねKENさん、渋木宏明(ひどり) さん

最終的にはブログサイトの記事のタイトルや本文などを抽出したいと思っております。
本文やタイトルはある程度固定のタグ(ブログサービスによりタグ名は異なりますが)なので、その情報を使って抽出を検討しています。
> 最終的にはブログサイトの記事のタイトルや本文などを抽出したいと思っております。
> 本文やタイトルはある程度固定のタグ(ブログサービスによりタグ名は異なりますが)なので、その情報を使って抽出を検討しています。

特定のブログサイトが対象ではなく、いくつかの異なるサイトが対象ということですか?

であれば、データ収集に関しては

・個々の(あるいは同系統の)サイトごとに個別のHTML解析・情報取得プログラムを作成する
・ブログサイトならRSSフィードが提供されているので、HTMLではなくRSSフィードから情報を取得する

のどちらかの手法を選択することになると思います。

本文データの取得が必須でないなら、後者が効率的です。

大手の検索サイトでやっているような本文データの厳密な解析が必要なら、そもそも HTMLDOM や正規表現だけでは太刀打ちできません。
>渋木宏明(ひどり)さん

>・個々の(あるいは同系統の)サイトごとに個別のHTML解析・情報取得プログラムを作成する
>・ブログサイトならRSSフィードが提供されているので、HTMLではなくRSSフィードから情報を取得する

確かに記事タイトルや日付取得はRSSフィードが有効と思っております。ただし本文についてはそのページに移って本文と思わしきところを解析する必要があります。RSSでは本文はなく記事の最初の何文字かしかなかったかと思います(ないサイトもあるかと)。

そもそもの議題からずれるかもしれませんが、RSSフィードを利用する場合、過去の更新情報をすべてたどることはできるのでしょうか?
あれって常に最新の情報が流れているため、たとえばプログラムでアクセスしようとしてもたどりきれないと思いますが、いかがでしょうか?

>大手の検索サイトでやっているような本文データの厳密な解析が必要なら、そもそも HTMLDOM や正規表現だけでは太刀打ちできません。

厳密に抽出したいとは思っていませんが、ある程度はとりたいと思っております。
そのためにはHTMLDOMが有効かと思って色々試していました。
>RSSでは本文はなく記事の最初の何文字かしかなかったかと思います(ないサイトもあるかと)。

全文入っていることもありますが、本文の一部分だけ収録している場合やまったく含んでいない場合もあります。

> そもそもの議題からずれるかもしれませんが、RSSフィードを利用する場合、過去の更新情報をすべてたどることはできるのでしょうか?

できません。
過去の情報が必要なら、自力で蓄積しておくしかありません。

> あれって常に最新の情報が流れているため、たとえばプログラムでアクセスしようとしてもたどりきれないと思いますが、いかがでしょうか?

でも、別にそれは RSS に限った話ではないでしょ?
ある URL がいつまで有効かなんて、誰にも分からないことだし。

> 厳密に抽出したいとは思っていませんが、ある程度はとりたいと思っております。
> そのためにはHTMLDOMが有効かと思って色々試していました。

ノイズや抽出ミスををどれだけ許容できるかにもよりますが、HTMLDOM や正規表現のような低レベルの解析手法だけで、不特定多数のサイトから一定の成果を得るのはかなり難しいです。

広告や各種ナビゲーションなどを多量に含んだ HTML ページから「本文」を引き出すためには、ある程度文書の「意味」を踏まえた解析手法が必要と思います。
  • 題名: Re[12]: htmlの構文解析
  • 著者: こど。
  • 日時: 2007/02/22 21:04:40
  • ID: 19151
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
ブログではかっちりした管理システムを使用してHTMLとCSSのセットでデザインをするため
一見かっちりした内部のルールがあるように見えますが、
nameやidの名前付けに規則、どころかHTMLの構造に関してもルールはありません。
提供されるテンプレートをそのまま使う際ですらデザイナさん毎に中身はかなりまちまちです。
なので…「特定サイト用」でないものを作るのは現実的に言えばほぼ不可能です。

ちなみにここでは公開しませんが私のブログは一般的なブログサービスを使用しているものの
0からHTMLとCSSを起こしていますので、完全にオリジナルの私のサイト専用の解析定義が
必要になります。

ある程度だとしても「汎用」とすると…かなり難しい世界です。

DOBON.NET | プログラミング道 | プログラミング掲示板