【VBA】Webスクレイピング-05:HTMLからデータを取り出す(Id/タグ名など)

VBAで実践するWeb操作 Excel

VBAでWEBスクレイピングの第5弾です。

前回記事はこちら

今回の記事では、HTMLからデータを取得する方法をいくつか紹介していきます。

要素を取得するメソッド

「要素」とは「対になるHTMLタグで囲まれた範囲」という風に理解してください。
「要素」を取得する方法には、以下のものがあります。

HTML要素を取得するメソッド
  • getElementById
    HTML内の「id」をキーに要素を取得します。
  • getElementsByName
    HTML内の「name」をキーに要素を取得します。
  • getElementsByTagName
    HTML内の「タグ名」をキーに要素を取得します。
  • getElementsByClassName
    HTML内の「class」をキーに要素を取得します。
タナイ
タナイ

getElementByIdだけElementsではなくElementである点に注意しましょう。

これは、後述しますがHTMLの構文規則上、idは一意の値としなくてはならず複数形にならないためです。

それぞれのメソッドで要素を取得し、表示してみましょう。

Wikipediaの「VBA」というページにアクセスしてみます。
https://ja.wikipedia.org/wiki/Visual_Basic_for_Applications

また、今回はVBAの「イミディエイト」というウィンドウに取得結果を表示します。
VBAの[表示]-「イミディエイトウィンドウ」を選択し、ウィンドウを開いておいてください。

サンプルコード

前述の4つの方法で、データを取得しています。

Option Explicit


Sub getElm()
    
    '■1.前処理
    'IEのオブジェクトを作成
    Dim ie As InternetExplorer
    Set ie = New InternetExplorer
    
    'IEが開かないように設定
    ie.Visible = False


    '■2.本処理
    '指定のURLを開く
    ie.Navigate ("https://ja.wikipedia.org/wiki/Visual_Basic_for_Applications")
        
    'ページの読み込みが完了するまで待つ
    Do While ie.readyState <> READYSTATE_COMPLETE
        'OSに制御を戻す
        DoEvents
    Loop
             
    Debug.Print ("=====Idから取得=====")
    
    '「firstHeading」というIdを持つ要素を取得
    Dim elmById As Object
    Set elmById = ie.Document.getElementById("firstHeading")
    '1件しか取得されないのでそのまま表示
    Debug.Print (elmById.outerHTML)
      
    
    Debug.Print ("")
    Debug.Print ("")
    Debug.Print ("=====タグ名から取得=====")
        
    
    '「h2」タグを取得
    Dim elmByTagName As Object
    Set elmByTagName = ie.Document.getElementsByTagName("h2")
    Dim i As Long
    '複数件取得されるのでループして出力
    For i = 0 To elmByTagName.Length - 1
        Debug.Print (elmByTagName(i).outerHTML)
    Next i
      
    
    Debug.Print ("")
    Debug.Print ("")
    Debug.Print ("=====nameから取得=====")
    
    '「search」というnameを持つ要素を取得
    Dim elmByName As Object
    Set elmByName = ie.Document.getElementsByName("search")
    '複数件取得されるのでループして出力
    For i = 0 To elmByName.Length - 1
        Debug.Print (elmByName(i).outerHTML)
    Next i
      
      
    Debug.Print ("")
    Debug.Print ("")
    Debug.Print ("=====classから取得=====")
      
      
    '「toclevel-1」というclassを持つ要素を取得
    Dim elmByClassName As Object
    Set elmByClassName = ie.Document.getElementsByClassName("toclevel-1")
    '複数件取得されるのでループして出力
    For i = 0 To elmByClassName.Length - 1
        Debug.Print (elmByClassName(i).outerHTML)
    Next i
      
      
    '■3.後処理
    ie.Quit
    Set ie = Nothing
            
End Sub

イミディエイトウィンドウに、以下のように出力されていれば、取得成功です。

=====Idから取得=====
<h1 class="firstHeading" id="firstHeading" lang="ja">Visual Basic for Applications</h1>


=====タグ名から取得=====
<h2 id="mw-toc-heading">目次</h2>
<h2><span id=".E6.A6.82.E8.A6.81"></span><span class="mw-headline" id="概要">概要</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: 概要" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=1">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id=".E6.A9.9F.E8.83.BD.E3.83.BB.E7.94.A8.E9.80.94"></span><span class="mw-headline" id="機能・用途">機能・用途</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: 機能・用途" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=2">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id="VBA.E3.81.AE.E6.AD.B4.E5.8F.B2"></span><span class="mw-headline" id="VBAの歴史">VBAの歴史</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: VBAの歴史" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=3">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id=".E8.BF.91.E5.B9.B4.E3.81.AE.E5.8B.95.E5.90.91"></span><span class="mw-headline" id="近年の動向">近年の動向</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: 近年の動向" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=4">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id=".E8.B3.87.E6.A0.BC.E6.A4.9C.E5.AE.9A.E8.A9.A6.E9.A8.93"></span><span class="mw-headline" id="資格検定試験">資格検定試験</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: 資格検定試験" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=5">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id=".E3.82.B3.E3.83.BC.E3.83.89.E4.BE.8B"></span><span class="mw-headline" id="コード例">コード例</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: コード例" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=6">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id="VBA.E3.81.AE.E3.82.BB.E3.82.AD.E3.83.A5.E3.83.AA.E3.83.86.E3.82.A3.E5.95.8F.E9.A1.8C"></span><span class="mw-headline" id="VBAのセキュリティ問題">VBAのセキュリティ問題</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: VBAのセキュリティ問題" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=8">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id=".E9.96.A2.E9.80.A3.E9.A0.85.E7.9B.AE"></span><span class="mw-headline" id="関連項目">関連項目</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: 関連項目" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=9">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id=".E8.84.9A.E6.B3.A8"></span><span class="mw-headline" id="脚注">脚注</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: 脚注" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=10">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span id=".E5.A4.96.E9.83.A8.E3.83.AA.E3.83.B3.E3.82.AF"></span><span class="mw-headline" id="外部リンク">外部リンク</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a title="節を編集: 外部リンク" href="/w/index.php?title=Visual_Basic_for_Applications&amp;action=edit&amp;section=11">編集</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2>案内メニュー</h2>


=====nameから取得=====
<input name="search" title="Wikipedia内を検索する [alt-f]" id="searchInput" accesskey="f" type="search" placeholder="Wikipedia内を検索">


=====classから取得=====
<li class="toclevel-1 tocsection-1"><a href="#概要"><span class="tocnumber">1</span> <span class="toctext">概要</span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#機能・用途"><span class="tocnumber">2</span> <span class="toctext">機能・用途</span></a></li>
<li class="toclevel-1 tocsection-3"><a href="#VBAの歴史"><span class="tocnumber">3</span> <span class="toctext">VBAの歴史</span></a></li>
<li class="toclevel-1 tocsection-4"><a href="#近年の動向"><span class="tocnumber">4</span> <span class="toctext">近年の動向</span></a></li>
<li class="toclevel-1 tocsection-5"><a href="#資格検定試験"><span class="tocnumber">5</span> <span class="toctext">資格検定試験</span></a></li>
<li class="toclevel-1 tocsection-6"><a href="#コード例"><span class="tocnumber">6</span> <span class="toctext">コード例</span></a>
<ul>
<li class="toclevel-2 tocsection-7"><a href="#ユーザー定義関数"><span class="tocnumber">6.1</span> <span class="toctext">ユーザー定義関数</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-8"><a href="#VBAのセキュリティ問題"><span class="tocnumber">7</span> <span class="toctext">VBAのセキュリティ問題</span></a></li>
<li class="toclevel-1 tocsection-9"><a href="#関連項目"><span class="tocnumber">8</span> <span class="toctext">関連項目</span></a></li>
<li class="toclevel-1 tocsection-10"><a href="#脚注"><span class="tocnumber">9</span> <span class="toctext">脚注</span></a></li>
<li class="toclevel-1 tocsection-11"><a href="#外部リンク"><span class="tocnumber">10</span> <span class="toctext">外部リンク</span></a></li>

メソッド名と、取得できるデータの数について

  • getElementById
  • getElementsByName
  • getElementsByTagName
  • getElementsByClassName

単数形「Element」と、複数形「Elements」のものがありますね。
これはHTMLの構文規則に関係があります。

「Id」の値は、1つのHTMLの中で一意という決まりがあります。そのため、Idは単数形「Element」。それ以外はHTML内に同じ値のものが複数出現しても良いので、複数形の「Elements」が使用されています。

また、getElements…は複数件のデータが取得できるので、取得した要素は配列に格納されます。

次回の内容

今回は要素を取得するメソッド「getElement(Elements)…」について説明しました。

次回は取得した要素からテキストを抜きだす方法について説明します。

コメント

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