none
HTMLソースの解析 RRS feed

  • 質問

  • HTMLファイルを読み込んで、必要な情報を表示するプログラムを作成しようとたくらんでいます。

    input.html(読み込むHTML)
    <html><title>サンプルページ</title><body><h1>サンプルページ詳細</h1><p>ああああああああああああああああ<p></body></html>

    このようなHTMLソースがあったとすると、
    string title = "サンプルページ";
    string midashi = "サンプルページ詳細";
    string naiyo = "あああああああああああああ"
    のように余計なHTMLタグを消した上で必要な情報のみ変数に入れて作成したいと考えております。

    そこで、
    StreamReader sr = new StreamReader("input.html");
    string swap = sr.ReadToEnd();
    string title = swap.Remove(0,13);
    string midashi = swap.Remove(0,48);
    string naiyo = swap.Remove(0,65);
    sr.Close();
    としましたが、いまいちうまくいきません。

    何が原因なのかいまいち分からず困っています。
    どなたかご教授願えないでしょうか?

    2008年4月15日 14:04

回答

  • 解決策の提示じゃないです。


     SpaghettiProgram さんからの引用

    HTML ファイルを読み込んで、必要な情報を表示するプログラムを作成しようとたくらんでいます。


    # どういう状況で使おうとされているのか分からないし、

    # 敢えて C# でやろうとされているので、それに合わせますが、
    HTML を扱うためのライブラリがあれば、そんなのを使われた方が楽なんじゃ
    ないですか?


    今時のプログラム言語環境ならありそうな気がします。

    2008年4月15日 14:44
  •  SpaghettiProgram さんからの引用

    何が原因なのかいまいち分からず困っています。
    どなたかご教授願えないでしょうか?

    期待する結果がどのようなもので、実際の結果がどのようなものになったかを見比べ、何が悪いか考えましょう。

    少なくとも、後ろに余計な文字列が多数ついているのではないかと推測します。

     

    あと、文字数を決めうちにすると、他のHTMLファイルではあっさり失敗します。

    練習として書くのは構いませんが、どんなHTMLファイルでも対応するということであれば、相応の苦労があるでしょう。

     

     custar さんからの引用

    HTML を扱うためのライブラリがあれば、そんなのを使われた方が楽なんじゃないですか?

    この辺とかですかね。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/687nondispbrowser/nondispbrowser.html

     

    もちろん、他にもあるかもしれません。

    2008年4月15日 15:12
    モデレータ
  •  Azulean さんからの引用

    練習として書くのは構いませんが、どんな HTML ファイルでも対応するという
    ことであれば、相応の苦労があるでしょう。


    HTML のスクレイピング (scraping) 目的かな?と思いましたが、それならば尚
    更ライブラリに任せた方がいいでしょう。

     

    結局は DOM (Document Object Model) の操作になると思います。

     

    2008年4月15日 15:31
  • 複数のWebページをスクリーンスクレイピングするのであれば、Webページ毎にそれ用のXSLTを用意して、それを使って行っても良いかもしれません。

    2008年4月15日 16:13
    モデレータ
  •  SpaghettiProgram さんからの引用

    無知で申し訳ないのですが、DOMとはどういったものなのでしょうか?

    http://ja.wikipedia.org/wiki/Document_Object_Model

     

    DOMは取り決めであって、具体的なライブラリや実装の話ではありません。

    2008年4月17日 13:34
    モデレータ
  • DOM を出してしまいまして、済みません。気にしなくても抜き出せます。
    # 知ってたら理解が深まるって程度です。


    Azulean さんが紹介されている @IT のサンプルを試してみたら、「へぇ」って
    感じで抜き出せるでしょう。

     

    その後は、サンプルの情報を元に msdn を調べ捲くる。

     

     

    あ、そうそう、今書かれていることは、

    目的を達するための手段の部分だと思うのですが、

    目的が分かれば、別なアプローチの提示があるかもしれませんよ。

    2008年4月17日 15:45
  • 自分でHTMLをパースしたいなら、この記事が参考になると思います

    http://japan.internet.com/developer/20051115/25.html

    2008年4月17日 22:11
  • .Net Frameworkの標準に備わっているものの範囲であれば、Regex(正規表現を用いて文字列を解析する機能)でかなりのことができると思います。

     

    2008年4月18日 0:58
  •  外池 さんからの引用

    .Net Frameworkの標準に備わっているものの範囲

    WebBrowserクラスも.NET Framework 2.0標準で備わっているものですよ!

     

     外池 さんからの引用

    Regex(正規表現を用いて文字列を解析する機能)でかなりのことができると思います。

    HTMLが綺麗なものなら正規表現も一手です。

    変なHTML(ブラウザは寛大に解釈してくれるけれど、タグ構造としては間違っている)まで相手にしないとダメになると大変ですが…。

    2008年4月18日 15:02
    モデレータ

すべての返信

  • 解決策の提示じゃないです。


     SpaghettiProgram さんからの引用

    HTML ファイルを読み込んで、必要な情報を表示するプログラムを作成しようとたくらんでいます。


    # どういう状況で使おうとされているのか分からないし、

    # 敢えて C# でやろうとされているので、それに合わせますが、
    HTML を扱うためのライブラリがあれば、そんなのを使われた方が楽なんじゃ
    ないですか?


    今時のプログラム言語環境ならありそうな気がします。

    2008年4月15日 14:44
  •  SpaghettiProgram さんからの引用

    何が原因なのかいまいち分からず困っています。
    どなたかご教授願えないでしょうか?

    期待する結果がどのようなもので、実際の結果がどのようなものになったかを見比べ、何が悪いか考えましょう。

    少なくとも、後ろに余計な文字列が多数ついているのではないかと推測します。

     

    あと、文字数を決めうちにすると、他のHTMLファイルではあっさり失敗します。

    練習として書くのは構いませんが、どんなHTMLファイルでも対応するということであれば、相応の苦労があるでしょう。

     

     custar さんからの引用

    HTML を扱うためのライブラリがあれば、そんなのを使われた方が楽なんじゃないですか?

    この辺とかですかね。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/687nondispbrowser/nondispbrowser.html

     

    もちろん、他にもあるかもしれません。

    2008年4月15日 15:12
    モデレータ
  •  Azulean さんからの引用

    練習として書くのは構いませんが、どんな HTML ファイルでも対応するという
    ことであれば、相応の苦労があるでしょう。


    HTML のスクレイピング (scraping) 目的かな?と思いましたが、それならば尚
    更ライブラリに任せた方がいいでしょう。

     

    結局は DOM (Document Object Model) の操作になると思います。

     

    2008年4月15日 15:31
  • 複数のWebページをスクリーンスクレイピングするのであれば、Webページ毎にそれ用のXSLTを用意して、それを使って行っても良いかもしれません。

    2008年4月15日 16:13
    モデレータ
  • すいません。
    無知で申し訳ないのですが、DOMとはどういったものなのでしょうか?
    いまいちぱっとしないのです。
    2008年4月17日 13:05
  •  SpaghettiProgram さんからの引用

    無知で申し訳ないのですが、DOMとはどういったものなのでしょうか?

    http://ja.wikipedia.org/wiki/Document_Object_Model

     

    DOMは取り決めであって、具体的なライブラリや実装の話ではありません。

    2008年4月17日 13:34
    モデレータ
  • DOM を出してしまいまして、済みません。気にしなくても抜き出せます。
    # 知ってたら理解が深まるって程度です。


    Azulean さんが紹介されている @IT のサンプルを試してみたら、「へぇ」って
    感じで抜き出せるでしょう。

     

    その後は、サンプルの情報を元に msdn を調べ捲くる。

     

     

    あ、そうそう、今書かれていることは、

    目的を達するための手段の部分だと思うのですが、

    目的が分かれば、別なアプローチの提示があるかもしれませんよ。

    2008年4月17日 15:45
  • 自分でHTMLをパースしたいなら、この記事が参考になると思います

    http://japan.internet.com/developer/20051115/25.html

    2008年4月17日 22:11
  • .Net Frameworkの標準に備わっているものの範囲であれば、Regex(正規表現を用いて文字列を解析する機能)でかなりのことができると思います。

     

    2008年4月18日 0:58
  •  外池 さんからの引用

    .Net Frameworkの標準に備わっているものの範囲

    WebBrowserクラスも.NET Framework 2.0標準で備わっているものですよ!

     

     外池 さんからの引用

    Regex(正規表現を用いて文字列を解析する機能)でかなりのことができると思います。

    HTMLが綺麗なものなら正規表現も一手です。

    変なHTML(ブラウザは寛大に解釈してくれるけれど、タグ構造としては間違っている)まで相手にしないとダメになると大変ですが…。

    2008年4月18日 15:02
    モデレータ
  • 外池です。

     Azulean さんからの引用

    WebBrowserクラスも.NET Framework 2.0標準で備わっているものですよ!

    変なHTML(ブラウザは寛大に解釈してくれるけれど、タグ構造としては間違っている)まで相手にしないとダメになると大変ですが…。

    なるほど・・・。

     

    HTMLを画面表示する機能は今回のご質問では不要とお見受けしたので、WebBrowserクラスはオーバースペックのように感じたのですが、ちまたに氾濫する多くのHTMLをなんとか構文解析するなら・・・、確かに既製品を使うことが良さそうですね。

     

     

    2008年4月22日 11:16
  • みなさんこんにちは。森田 知良です。
    Forumのご利用ありがとうございます

     

    回答を寄せてくださったみなさん、有用な情報ありがとうございました。

    SpaghettiProgramさん、その後いかがでしょうか?

    私の方で回答を投稿してくださったみなさんの情報は、有用な情報と判断しましたので、
    勝手ながら回答済みチェックをつけさせていただきました。
    SpaghettiProgramさんは、回答済みチェックを解除することもできますのでご確認ください。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有効な回答があった場合は、なるべく回答済みボタンを押してチェックを付けてくださるようお願いします。
    また、追加の質問がありましたら、是非もう一度投稿してくださるようお願いします。

     

    それでは、これからもフォーラムのご利用をよろしくお願いいたします。

    2008年4月28日 5:37