HTML要素の一覧を取得してエクセルファイルに取り込む(スクレイピング)【EXCEL/VBA】

Excel

VBAでウェブページのデータを取得して、エクセルの表に取り込みます。
例としてyahooのトップページ(https://www.yahoo.co.jp/)を取り込んでみます。

VBAでウェブページを取り込む時の対応ブラウザはIEのみです。
それ以外のブラウザは使用できません。。

HTMLコードをこんな感じで取り込みます

1つの要素に対して、エクセルの1行に収まるように取得します。

取得する要素は次の通りです。全部で5つあります。

取得したデータについて調べました。簡単ですが次のようになります。

  1. TypeName
    データの型
  2. tagName
    指定したHTML要素の名前
  3. outerHTML
    指定したHTML要素とその子要素
  4. innerHTML
    指定したHTML要素の子要素
  5. outerText
    指定したHTML要素のテキスト

上記の例だと、指定したHTML要素は「section」で、③ではsectionタグとそれに含まれる子要素も取得されています。④は「section」を除いた子要素のみ取得されています。

子要素は「h1」「ul」「li」「a」まで取得できてますが、実際のコードでは「a」タグ以下にspanタグもあります。これはVBAで取得する文字列を256文字まで制限しているからです。
⑤では「a」タグで指定されているテキストリンクの文字列が取得されています。

完成したVBAコード(全体)

完成したコードはこちらです!yahooのトップページの要素を取得するように設定されているので、他のサイトを取得する場合、MakeIchiranプロシージャーで宣言されているobjieの値を変更してください!

Set objie = UrlIE(“https://www.yahoo.co.jp/“)

Option Explicit


'URLを指定してIEを取得する
Function UrlIE(UrlTarget As String) As Object
    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")

    ie.Visible = True
    ie.navigate UrlTarget

    Do While ie.Busy = True Or ie.readyState <> 4
        DoEvents
    Loop
    Set UrlIE = ie
End Function

'要素を全て取得(確認用の要素一覧)
Sub MakeIchiran()
    Dim objie As Object
    Set objie = UrlIE("https://www.yahoo.co.jp/")
    Call Ichiran_Make(objie)
    MsgBox "一覧を作成しました"
End Sub

Sub Ichiran_Make(objie As Object)
    Dim el As Object
    Dim n As Long
    
    
    Sheets("一覧").Select
    Cells.ClearContents


    'タイトル入力
    Cells(1, 1) = "No."
    Cells(1, 2) = "TypeName"
    Cells(1, 3) = "tagName"
    Cells(1, 4) = "outerHTML"
    Cells(1, 5) = "innerHTML"
    Cells(1, 6) = "outerText"

    '幅指定
    Cells(1, 1).ColumnWidth = 5.63
    Cells(1, 2).ColumnWidth = 9.63
    Cells(1, 3).ColumnWidth = 4.75
    Cells(1, 4).ColumnWidth = 12.38
    Cells(1, 5).ColumnWidth = 12.38
    Cells(1, 6).ColumnWidth = 12.38

    For Each el In objie.document.all
        n = n + 1
        Cells(n + 1, 1) = n
        Cells(n + 1, 2) = "'" & TypeName(el) 'TypeNameでオブジェクトのタイプを表示
        Cells(n + 1, 3) = "'" & el.tagName   'タグの名前
        Cells(n + 1, 4) = "'" & Left(el.outerHTML, 256)
        Cells(n + 1, 5) = "'" & Left(el.innerHTML, 256)
        Cells(n + 1, 6) = "'" & Left(el.outerText, 256)
    Next el
End Sub

ウェブページの読み込みが完了するまで処理を止める

ページの読みが完了しない状態でHTML要素を取得しようとすると、エラーになる場合があります。
そのため、サイトのページ読み込みが完了してから処理を実行します。

Do While ie.Busy = True Or ie.readyState <> 4
   DoEvents
Loop

これはお約束なので、そのまま覚えます。
ちなみに、DoEventsはVBAからOSに制御を渡す関数で、IEがページ読み込みを完了するまで実行します。
ページ読み込み完了は、InternetExplorerオブジェクトのBusyプロパティと、readyStateプロパティの値で判定します。

<参考サイト>

VBAでHTMLコードを取得する | IE操作の自動化
エクセルVBAでIEのHTMLコードを取得するためのinnerHTML,innerText,outerHTML,outerTextについて解説しています。VBAによるIE(Internet Explorer)制御やデータ取得など基本的なものから実践向けの内容まで幅広くカバーした入門サイト。
outerTextとinnerTextの違いについて | IE操作の自動化
エクセルVBAでIEのHTMLコードを取得するためのouterTextとinnerTextの違いについて解説しています。VBAによるIE(Internet Explorer)制御やデータ取得など基本的なものから実践向けの内容まで幅広くカバーした入門サイト。

まとめ

開いたページを表示させたら、InternetExplorerオブジェクトとして取得します。
あとは、オブジェクトが持っているプロパティやメソッドを調べながら、どんな値が取得できるか試行錯誤しながらの作業となります。これはHTMLの構造をチェックするのに役立つコードだと思いました。

コメント