質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

4309閲覧

VBAで、HTML要素の子要素をオブジェクトとして取得したい

Zoohomi

総合スコア26

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2017/07/10 13:42

VBAのスクレイピングについて質問です。

膨大なHTMLページの中に、以下のDIVがあります。

HTML

1<div id="tables"> 2 <table> 3 <tbody> 4 <tr> 5 <td>やまだ</td> 6 </tr> 7 </tbody> 8 </table> 9 <table> 10 <tbody> 11 <tr> 12 <td>さとう</td> 13 </tr> 14 </tbody> 15 </table> 16 <table> 17 <tbody> 18 <tr> 19 <td>ほんだ</td> 20 </tr> 21 </tbody> 22 </table> 23 <table> 24 <tbody> 25 <tr> 26 <td>たなか</td> 27 </tr> 28 </tbody> 29 </table> 30 <table> 31 <tbody> 32 <tr> 33 <td>すずき</td> 34 </tr> 35 </tbody> 36 </table> 37</div>

上記HTMLの、テーブルの中の氏名をエクセルシートに出力したいのです。
膨大なボリュームのhtmlページの中から、
「id="tables"の要素を取得して、その中のテーブル要素のtdの値を取得する」
というのが目的の処理です。
実際にはdiv内のテーブル数はかなりの数があります。
先ほど書いてみた処理は
getElementById("tables").innerHTMLをした時点で、返却値が文字列になってしまい、テーブルをループさせる処理などが複雑になる(文字列内から「td」という文字位置を取得して、その次の「 > 」の直後~「 < 」の直前までを記憶・・・をinnerHTMLで取得した文字列を全て走査するまで繰り返す・・・といった処理になり、非常に非効率です)ので、
理想的な動作は、
**「getElementById("tables")のinnerHTMLから、table要素の配列(コレクション)をループで回せる」**ような処理です。

ある要素の「中にある要素」をコレクションなどで返却してくれる関数が欲しいというイメージでしょうか?

VBAでのIE操作・スクレイピングに詳しい方、ご教授の程宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「id="tables"の要素を取得して、その中のテーブル要素のtdの値を取得する」
というのが目的の処理です。

下記のコードでどうでしょう。

Dim coltd As IHTMLElementCollection Dim el As IHTMLElement Set coltd = htmlDoc.getElementById("tables").getElementsByTagName("td") For Each el In coltd Debug.Print el.innerText Next el

参照設定
Microsoft HTML Object Library
Microsoft Internet Controls

投稿2017/07/10 15:30

編集2017/07/11 16:03
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zoohomi

2017/07/11 15:14

解決致しました! 返却値をさらにgetElementsByTagNameしてIHTMLElementCollection型のコレクションで受け取るのですね。 非常に快適です、ありがとうございます^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問