- ベストアンサー
htmlで記述されたWebページの解析と情報取得
特定のWebページを取得し、その情報の一部を利用したいと思っています。 そのページはXML形式ではなく一般的なhtml形式です。 今はやり方がわからない為、ブラウザに一旦受けさせて ブラウザの機能でパースしてもらってそれを利用しています。 しかし、スマートではないのでこのやり方から卒業したいと思っています。 (そもそもAjaxじゃないし) これを(一旦html文字列を取得して)何かのJavaScriptライブラリ等を利用して 「getElementsByName…」等を利用できる形のオブジェクトに 変換したいと思っています。 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open('GET', …); … htmlStr = xmlhttp.responseText; // ←これを使う? htmlDom = hoge.parse(htmlStr); htmlDom = xmlhttp.responseHTML; // ←こんな感じのがあれば最高 alert(htmlDom.getElementsByName("…")[0].value); google提供のライブラリに「GXml.parse」というものがあり、 XML文字列をXML DOM 形式にパースするという機能があります。 これのhtml版はないものかと思っているしだいです。 例えば、以下のページ(どちらでもいい)から為替レートを取得したい場合などです。 外為 レート - Infoseek マネー http://money.www.infoseek.co.jp/MnForex/fxrate/ 外為 米ドル/円 - Infoseek マネー http://money.www.infoseek.co.jp/MnForex/fxdetail/?fx=F1001 ※今回の質問は「どこでもいいから為替レートを取得する方法」ではありません。 知りたいのはhtmlのパース方法です。為替はあくまでも例です。 (Webブラウザにレンダリングさせないで) html文字列をparseする方法。(JavaScriptライブラリの使用可) ※html文字列からでなくともいい これを教えてください。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
HTMLの文法はタグの省略が可能な部分が多く、XMLパーサーではエラーになることが多いです。 XMLパーサーとHTMLパーサーの違いですね。 HTMLパーサーの方が複雑です。 var doc=document.createDocumentFragment(); doc.innerHTML= xmlhttp.responseText; alert(doc.getElementsByName('a')[0].value); 未検証です。 <body>の直後から</body>の直前までを取り出しておいた方がいいかもしれません。 xmlhttp.responseText.match(/<body.*?>(.*)<\/body>/); var html=RegExp.$1; // htmlを上記innerHTMLに代入 未検証です。
その他の回答 (1)
- annyG
- ベストアンサー率25% (10/39)
多分できないんじゃないでしょうか。 HTMLはそれができないという欠点があったためXMLが注目され、 一方HTMLではidアトリビュートが仕様として追加された、 という経緯があったと記憶しています。 つまり、それができるのであればXMLも必要ないし、idアトリビュートも 必要なかった、ということではないかと。 もっともそれを乗り越えて、多少方法が複雑でも頑張ってくれるような ライブラリがこの世に存在しません、ってことはないかと思います。 確かに以前使っていた製品の内部ライブラリはそんなことをやろうと してました。が、あまりに使いづらいので、いつのまにか 消えてしまいましたが。。。。
お礼
なるほど。そういうもんですか。 基本的にはブラウザ君の力に頼るしかないのかもしれませんね。 それか、html文字列を正規表現とかで解析するか。 ということはブラウザのparse機能は 柔軟でかつ優秀ということなのかもしれませんね。 参考になりました。ありがとうございました。
お礼
紹介いただいた方法で試してみました。 しかし、正規表現がうまく効かなかったり(技術力不足のため) 文字コードの問題で引っかかってしまったりして結局うまくいきませんでした。 なのであきらめ普通にiframeで読み込み、非表示にしてパースで記述したところ 非常に簡単に実装完了することが出来ました。 この労力差を考えると、少なくとも今はまだ、何が何でもAJax的な手法に こだわらなくてもいいかと思うようになりました。 汚くても、スマートじゃなくてもしばらくは古い方法を使うことにしました。 しかし紹介していただいた考え方は参考になりました。 目からうろこが落ちる思いでした。 ありがとうございました。