【EXCEL VBA】SeleniumBasicでHTML要素を複数取得したい – FindElementsBy

SeleniumBasicで指定したHTML要素を複数取得する方法について紹介します。検索結果など複数表示されている要素をループ処理で取得する方法の紹介となります。複数要素の取得方法はいくつか用意されていますが、1つだけ覚えれば大丈夫です。あとは簡単な応用となります。

また、HTML要素が見つからなかった場合の処理についても簡単に紹介します。

FindElementsByClassで解決する

指定されているclass属性値をFindElementsByClassに指定するとWebElements型でHTML要素を複数取得することができます。WebElements型はList型なので、ループ処理にて1つずつ取得して、Text関数を使うことで文字列を取得できます。

FindElementByとFindElementsByの違いは、単一要素(WebElement)か複数要素(WebElements)を返却するかの違いです。

関数返却型説明
FindElementBy系WebElement複数要素が見つかっても、最初の要素のみ返却する
FindElementsBy系WebElements1つしか要素が見つからなくても、長さ1のWebElementsが返却される

FindElementsBy系の関数は他にもいくつかありますので、以下に記載します。FindElementsByCssとFindElementsByXPath以外は、ほぼ使い方は一緒です。

関数名説明
FindElementsById指定されたidに一致する要素を検索する。
FindElementsByClass指定されたCSSクラスに一致する要素を検索する。
FindElementsByLinkText指定されたリンクテキストに一致する要素を検索する。
FindElementsByName指定された名前に一致する要素を検索します。
FindElementsByPartialLinkText与えられたリンクテキストの部分に一致する要素を探す
FindElementsByTag指定されたタグ名に一致する要素を検索する。
FindElementsByCss指定されたCSSセレクタに一致する要素を検索します。
FindElementsByXPath指定されたXPathに一致する要素を検索する。

サンプルプログラム(コピペでOK)

最安値.comから大手通販モール名一覧を取得するサンプルプログラムコードを記載しました。大手通販モール名が記載されている箇所のclassは”p_dt30″であるため、FindElementsByClassで取得することができます。

Option Explicit

Sub sample()
    Dim dr As New Selenium.WebDriver
    dr.Start "Chrome"
    
    dr.Get "https://www.saiyasune.com/J4902370542905.html"
    
    Dim els As WebElements
    Set els = dr.FindElementsByClass("p_dt30")
    Debug.Print "取得要素数:"; els.Count   ' 取得要素数: 6
    
    Dim i As Long
    For i = 1 To els.Count
        Debug.Print els.Item(i).Text()      ' 楽天市場 Qoo10 Yahoo!ショッピング amazon.co.jp auPAYマーケット PayPayモール
    Next
   
    Stop
End Sub