VBAで複数のタグを指定してHTMLを取得する方法

このQ&Aのポイント
  • VBAのMSHTML.HTMLDocumentを使用してWEB上から指定した複数のタグ内のテキストを取得する方法について調査しています。
  • getElementsByTagNameメソッドでは一つのタグしか指定できず、個別に取得すると関連がバラバラになってしまうため、複数タグを指定する方法を模索しています。
  • ループ処理を使用して、h1のタグを見つけてその内部のテキストとtdタグのテキストを取得し、再びh1タグを見つけるまで繰り返す方法を考えています。自作する以外に解決策はありませんか?
回答を見る
  • ベストアンサー

複数タグ指定してHTMLを取得したい

VBAでMSHTML.HTMLDocumentを使用してWEB上から指定したタグ内のテキストを取得しようとしているのですが、取得したいデータがタグが複数に分かれています。 divの特定クラス内だけなど取得したいのですが、データ1は<h1>データ2は<td>や<p>など、getElementsByTagName(tag)だと、一つしかタグを指定きず、個別に取得するとデータ1とデータ2の関連がバラバラになってしまう為、複数タグを指定して取得できる方法を探しています。 イメージとしてはgetElementsByTagName(tag).Lengthが10の時にh1のタグを発見してそこからh1のinnerTextとtdタグ2つ分のinnerText取得して、またh1タグを発見するまでループして取得するような形に出来ればと思っています。 自作する以外ないのでしょうか?

  • HTML
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>getElementsByTagName(tag)だと、一つしかタグを指定きず getElementsByTagName('*')とか?

ipyodora
質問者

お礼

回答ありがとうございます。 昨日、getElementsByTagName('*')が出来ると言う情報を見て、試してみましたが、あまりに重かったので断念しました。2つや3つぐらい指定できると良いなぁと思っていたら、Selectors APIと言うもので、document.querySelectorAll('span, strong');とすれば取れる事が分かりました。 ただ、仕様が分からずです・・・。 VBAでのサンプルがあれば助かると思いつつ調べ中です。

その他の回答 (1)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

そうだねぇ 親tagを getElementsByTagName で持ってきて解析 が最も速いだろうね。 ただ、最初の1回をxpath指定をして取り出す方法があるからそれを使うのも有りかな。 速度的には親を持ってきて解析が速いと思うけど・・・ xpathのはなんてメソドだかはちょっと忘れちゃった。調べる時間が無いので参考ってことで。

ipyodora
質問者

補足

回答ありがとうございます。私の説明不足でした、すいません。 (その他htmlが続く) <h1>エイチ1</h1> <p>ピー1</p> <p>ピー2</p> (その他htmlが続く) <h1>エイチ2</h1> <p>ピー3</p> <p>ピー4</p> <p>ピー5</p> (その他htmlが続く) エイチ1~ピー1までと、エイチ2~ピー5までを取得したいと思っています。 親tagとなるdivなどを発見する度に・・・と言う処理なら objDiv = doc.getElementsByTagName("div") objDiv.getElementsByTagName("p").item(i).innerText と言う感じで取れました。

関連するQ&A

  • ExcelのVBAでHTMLのタグ数を取得するには

    VBAでHTMLソースからタグ指定で情報を取得したいのですが、そのページ内にある特定のタグ数を取得する方法で躓いています。 例えば、下記のURLの"TD"のtagNameから情報を抜き出しているのですが、他のページでは"TD"タグ数が変わってきます。ループ条件で"TD"のタグ数が必要なので、数を取得して変数として代入したいのですが、どうすれば良いでしょうか。ちなみに下のサイトの"TD"の数は71個です。 http://db.netkeiba.com/horse/ped/2010110097/

  • C# HtmlDocumentでテキスト取得したい

    お世話になります。 HtmlDocumentで、タグの中のテキストのみを 取得したいのですが、どうもよく解りません。 例) <div id='a1'>あいうえお <span id='a2'>かきくけこ <span id='a3'>さしすせそ </span> たちつてと </span> なにぬねの </div> 上記のような例があった場合、idが『a1』のテキストを 取得しようと、メソッドのOuuerTextとInnerTextを呼び出すと、 『あいうえおかきくけこさしすせそたちつてとなにぬねの』と、 その中すべてが帰ってきてしまいます。しかも配列ではなく、 一つの文字列として。 a1で取得した場合、『あいうえお』と『なにぬねの』の 配列変数で取得したいのですが(つまり、ほかのタグで 囲まれているものは走査しないが、区切りとしては見る)、 メソッド一発でできないのでしょうか。 OuterTextとInnerTextの効果の違いもよくわかりません。 コツコツと手作業で行うしかないのでしょうか? よろしくお願いします。

  • <pre>タグ内のテキストを取得 エクセル VBA

    HTML文書で以下のようになっているテキストをエクセルVBAで取得しようと思います。 <pre class="fontsize3"><tt> テキスト </tt></pre> 以下のコードを書きましたが、失敗しています。 Dim htdoc As HTMLDocument Set htdoc = ie.Document Cells(1,1) = htdoc.getElementsByTagName("pre")(0).innerText 何がまちがっているのでしょうか。

  • webbrowserで特定のタグを取得したい

    VB6もしくはVBAです。 HTMLの中をループしてタグを取得しています。 For Each myTag In myIE.Document.all.tags("TD") 次のようなHTMLがあって"このTD"に含まれるAタグを取得したい場合、 指定のTD内だけでループしてAタグを取得するにはどうしたらいいのでしょうか? <table width="200" border="1"> <tr> <td><a href="#">AAAAA</a><a href="#">AAAAA</a><a href="#">AAAAA</a></td> 'このTD <td><a href="#">BBBBB</a><a href="#">BBBBB</a><a href="#">BBBBB</a></td> <td><a href="#">CCCCC</a><a href="#">CCCCC</a><a href="#">CCCCC</a></td> </tr> <tr> <td>DDDDD</td> <td>EEEEE</td> <td>FFFFF</td> </tr> <tr> <td>GGGGG</td> <td>HHHHH</td> <td>IIIII</td> </tr> </table>

  • WEBページの表のデータを取得

    外部にあるWEBページにある表のデータを取得したいのですが、色々調べてみましたが見つからなくて、ご存じの方教えてください! あるWEBページに表がいくつかあります。 その中の一つの表のデータが全部欲しいです。 その表のTableタグにはIDがふってあります。 その表を囲んだDIVタグにもIDがふってあります。 URLは固定です。 TDタグの全てにはClassタグが入っています。 VB2005を使っています。 どのようにすればいいか見当がつかなくて、これ↓を使えばいいのかなあというくらいしかわかりませんでした。。(泣) Document.Body.GetElementsByTagName() どうぞよろしくお願いいたします。

  • html4.01で使われないことが推奨されているタグ

    タグの参考書にHTML4.01に使われないことが推奨されているタグがあり、そのタグはスタイルシートに替えて使用することが書かれていました。 主要なもので、タグではfontタグが、属性ではcoloerの指定、div、p、table、tr、td、h1~h6、imageのalignの指定、imageの borderの指定、trとtdのwidthとheightなどがありましたが、リニューアルされたばかりのページなどを見ても、完全にそれを守っているページはありませんでした。fontタグは使われていなかったのですが、それ以外のタグはそのまま使ってhtml4.01Transtisionとするのは一般的なのでしょうか。推奨を守ってhtml4.01 strictとして制作しているwebデザイン会社などはどのくらいあるのでしょうか。 fontタグはできるとしても、alignやborderなどを使用しないで作成すると、すべてのtdやtrなどにclass指定で指定する方法でしょうか?

    • ベストアンサー
    • HTML
  • HTMLタグについて

    <!-- #EndEditable --> <meta http-equiv="content-type" content="text/html; charset=Shift_JIS"> <link rel="stylesheet" href="古いデーター/text.css" type="text/css"> </HEAD> <BODY bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="5" marginwidth="0" marginheight="5"> <table width="760" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td><div align="center"><img src="toppu2.gif" width="700" height="92"></div></td> </tr> </table> <div align="center"> <table width="760" border="0" cellspacing="0" cellpadding="0"> <tr> <td><div align="center"><img src="botan4.gif" width="700" height="57" border="0" usemap="#Map6"></div></td> </tr> <tr> <td><div align="left"><!-- InstanceBeginEditable name="contents" --> _________________________  上記のタグで 【<link rel="stylesheet" href="古いデーター/text.css" type="text/css"> 】が文字化けしてるから可笑しいと思うのですが、これを テンプレート上で下記のように修正してもエラーが出て 上手くいきません。 <link rel="stylesheet" href="../../text.css" type="text/css">  この他におかしい部分が多分あると思うのですが、 そこをお教えください。  宜しくお願い致します。

  • エクセルのHTMLのループ取得でフリーズする

    標題の件で、エクセルのマクロでMSHTMLを用いてあるサイトの1ページ目、2ページ目・・・とループ処理でHTMLを取得する際、3回目以上のループからマクロがフリーズ(フリーズする際のループ回数はランダムです)してしまいまい、フリーズせずに全ページを取得できるようにプログラムを直したいです。 【使用プログラム】※・・・は記載省略 ' ' // ・・・ Sub sample() ・・・ Do While ・・・ ・・・ Call untilReady(htmlDoc) ・・・ Loop End Sub Sub untilReady・・・ ※このSubの中身はサイト"エクセルの神髄"様  (http://excel-ubara.com/excelvba5/EXCELVBA222.html)  の"MSHTML.HTMLDocumentを使った方法です。"記載部の  Sub untilReady~End Subまでとほぼ同じで、  DoEventsとIf Now()~の間に sleep 100 を入れています ・・・End Sub ' ' // 回答者にはお礼しか言うことが出来ませんが、よろしくお願いします。

  • RubyのHTMLパーサーで複数のタグを抽出したい

    現在、Rubyを用いて あるWebページから特定のタグの要素を抽出して テキストデータに出力したいと思い、プログラムを書いているのですが、 途中で行き詰ってしまいました。 ちなみにHpricotやNokogiriといったHTMLパーサーを試してみました。 パーサーを使うのは初めてです。 例えば以下のようにHTML文書に抽出したい部分がDIVタグとPタグに囲まれていた場合、 ===================================== ・・・ <div class="content"> <div class="header">不要部分</div> <div class="title">抽出したい文字列1</div> <div class="subtitle">抽出したい文字列2</div> <div class="subtitle">抽出したい文字列3</div> <p class="paragraph">抽出したい文字列4</p> <p class="paragraph">抽出したい文字列5</p> <div class="comment">抽出したい文字列6</div> <div class="footer">不要部分</div> </div> ・・・ ===================================== このHTMLからまずは 抽出したい文字列1 抽出したい文字列2 抽出したい文字列3 抽出したい文字列4 抽出したい文字列5 抽出したい文字列6 といった出力が得たいのです。 プログラムも書いてみました。 ===================================== #ドキュメント全体を取得(dataにはHTMLの文字列が入っている) html = Hpricot(data) #内容部分(contentクラスのdiv)を取得(CSSセレクタで記述) content = html/"div.content" ===================================== ここまでは良いのですが、 そのあと、div要素を取り出すだけであれば headerクラスと、footerクラスを抽出しないように ===================================== (content/"div:not(.header):not(.footer)").each{ |line| puts line.inner_html } ===================================== とすることで、 抽出したい文字列1 抽出したい文字列2 抽出したい文字列3 抽出したい文字列6 が得られますが、pタグをカンマでdivの前に追加して ===================================== (content/"p,div:not(.header):not(.footer)").each{ |line| puts line.inner_html } ===================================== のようにすると、 抽出したい文字列4 抽出したい文字列5 抽出したい文字列1 抽出したい文字列2 抽出したい文字列3 抽出したい文字列6 のように出力されます。 同様にdivの後にpを追加し ===================================== (content/"div:not(.header):not(.footer),p").each{ |line| puts line.inner_text } ===================================== のようにすると 抽出したい文字列1 抽出したい文字列2 抽出したい文字列3 抽出したい文字列6 抽出したい文字列4 抽出したい文字列5 のようになってしまいます。 つまり、複数のタグを指定すると、指定した順序で抽出されるようです。 代わりに子供すべてを列挙するchildのようなものがあるかと、調べてみたのですが、 どうやらそのような書き方はないようです。 複数のタグを含む場合にはHTMLパーサーでは解析できないのでしょうか。 パーサーは抽出時に順番を保証はしてくれないのでしょうか。 あきらめて、正規表現で抽出しようと思いましたが、 ===================================== <div class="comment"> <div class="comment_header">ごちゃごちゃ</div> <div class="comment_body">抽出したい要素6</div> </div> ===================================== などDIVが入れ子となっている場合に、 非常にややこしく感じたので お手上げ状態です。 どのように、解決できるでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • 共通したクラス名を持つ複数のタグのIDを取得したい

    共通したクラス名を持つ複数のタグのIDを取得したい <div class="classA" id="id1">aaa</div> <div class="classB" id="id2">bbb</div> <div class="classA" id="id3">ccc</div> となっているHTMLファイルからjqueryで要素を取得するプログラムを作成しています この時、class="classA"となっているID(id1とid3)とテキスト(aaaとccc)をjqueryで取得する方法を考えています jqueryで、 var elements = $(".classA"); でclass名がclassAの要素の数を取得したり、 var id = $(".classA").attr("id"); でidを指定すれば取得することもできました しかし、これはjqueryがあらかじ

専門家に質問してみよう