【エクセルVBAでIE操作】WEBページのテーブル要素からセルのデータを取り出す方法


cell

photo credit: andrey.pehota via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者向けエクセルVBAでIEを操作するシリーズをお送りしています。

前回の記事はこちら。

【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
初心者向けエクセルVBAでIEを操作するシリーズ7回目。今回はHTMLにおけるテーブルの構成の仕方に触れつつ、そのテーブル内のデータを取得するというWEBスクレイピングらしいテクニックを解説します。

IEでWEB上の表を取得し、その各行のテキストを取得する方法をお伝えしました。

さて、行を表すtr要素の配下には、さらにセルを表すtd要素というものがあります。

今回は、それを一つ一つ取り出していきたいと思います。

ということで、WEBページのテーブル要素からセルのデータを取り出す方法です。

では、行ってみましょう!

スポンサーリンク

前回のおさらい

前回からテーマにしているのは、こちらのYahooファイナンスの時価総額ランキングのページです。

時価総額上位:株式ランキング – Yahoo!ファイナンス

前回は、HTMLで表の構造がどのようになっているのか、Google Chromeのデベロッパーツールで確認をしつつ、以下のようなプロシージャを作成しました。

Sub MySub()
    
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    
    objIE.Visible = True
    objIE.Navigate "https://info.finance.yahoo.co.jp/ranking/?kd=4"
    
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.Document
    
    Dim tr As HTMLTableRow
    For Each tr In htmlDoc.getElementsByTagName("tbody")(0).getElementsByTagName("tr")
        Debug.Print tr.innerText
    Next tr
    
End Sub

ページ内に、テーブルの本体セクションを表すtbody要素が1つしかありませんので、それをまず取得、その後それに含まれる行を表すtr要素をコレクションとして取得しました。

さて、今回はそのtr要素の配下にさらにtd要素がありますので、その取得をしていきたいと思います。

テーブルの各セルのテキストを取り出す

tr要素からtd要素のコレクションを取得する

前回のプロシージャの17~19行目で、tr要素についてのループになっていますが、このtr一つ一つについてtd要素を取得して、それについてループをするというネスト構造にしていけば良さそうです。

tr要素を表すHTMLTableRowオブジェクトに対しても、他のHTML要素と同じくgetElementsByTagNameメソッドを使うことができます。

HTMLTableRowオブジェクト.getElementsByTagName(タグ名)

これで、td要素HTMLTableCellオブジェクトのコレクションとして取得できるわけです。

td要素のコレクションをループしてテキストを取り出す

そのコレクションに対してループをしてあげれば、個々のセルのデータを取り出すことができます。

Dim td As HTMLTableCell
For Each td In tr.getElementsByTagName("td")
    'td要素に対する処理
Next td

今回も、innerTextプロパティでテキストを取り出してみましょう。

HTMLTableCellオブジェクト.innerText

テーブルのtd要素のテキストを取り出すプロシージャ

では、以上を踏まえてプロシージャを作り直します。

こちらです。

Sub MySub()
    
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    
    objIE.Visible = True
    objIE.Navigate "https://info.finance.yahoo.co.jp/ranking/?kd=4"
    
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.Document
    
    Dim tr As HTMLTableRow
    For Each tr In htmlDoc.getElementsByTagName("tbody")(0).getElementsByTagName("tr")
        
        Dim td As HTMLTableCell
        For Each td In tr.getElementsByTagName("td")
            Debug.Print td.innerText,
        Next td
        
        Debug.Print
    Next tr
    
End Sub

実行をすると、以下のような出力を得られます。

テーブルのtd要素のテキストを出力

まとめ

以上、エクセルVBAでWEBページのテーブル要素からセルのデータを取り出す方法をお伝えしました。

入れ子状態にはなっていますが

  1. getElementsByTagNameメソッドでコレクションを取得
  2. For Each文でコレクションをループ
  3. 各要素に対して処理

という基本動作の組み合わせになっていることがわかりますよね。

テーブルはこのような階層構造を取得するには良い題材ですよね。

次回以降、さらに凝った取得の仕方についてお伝えできればと思います。

【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
初心者向けエクセルVBAでIEを操作するシリーズです。今回はIEを操作してWEBページ内の検索窓に任意のキーワードを入力して送信する方法をお伝えします。GoogleChromeの検証機能も活用しますよ!

どうぞお楽しみに!

連載目次:エクセルVBAでIEを操作してWEBスクレイピング

IEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。

  1. 【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
  2. 【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
  3. 【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
  4. 【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
  5. 【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
  6. 【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
  7. 【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
  8. 【エクセルVBAでIE操作】WEBページのテーブル要素からセルのデータを取り出す方法
  9. 【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
  10. 【エクセルVBAでIE操作】検索結果一覧から記事タイトルを取得する方法
  11. 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
  12. 【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する
  13. 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする
  14. 【エクセルVBAでIE操作】name属性を利用して画像ボタンをクリックする
  15. 【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする

タイトルとURLをコピーしました