【ExcelVBA】SeleniumでinnerText

Excel VBAにおいてSelenium BasicでinnerTextをとってくる方法が分かったので、自分用に記事にします。

innerTextはTextで代用できる

Selenium BasicではinnerTextを使わなくてもTextで代用できます。たとえば、こんな感じ↓

ws.Range("B" & j + 4).Value = brand.Text

brandはWebElement型の変数です。

ところが、これでは値をとってこれない場合がありました。

Textではうまくいかなかった例

こういう横にスクロールするサイトがその例です。

横スクロール

図にあるようなテキストをVBAでSeleniumを介してとってこようとしたところ、画面に表示されていない要素のテキストはブランクとなりました。

なんで?と調べたら、CSSでoverflowがhiddenに設定されていました。

overflowがhidden

そのせい?

私はCSSやHTMLには詳しくないので分かりませんが、とにかくこういった設定の要素についてはWebElement.Textでは値をとってこれないようでした。

AttributeでinnerTextを使う

ところが、WebElement.Attribute(“innerText”)だとうまく値をとってくることができました。

ws.Range("B" & j + 4).Value = brand.Attribute("innerText")

innerTextはInnerTextでもinnertextでもだめです。正確にinnerTextと書かないといけません。

まとめ

これまで私はWebElemnet.innerTextなどと書いてはエラーを喰らって挫折していました。まさかAttributeで呼び出すとは。

SeleniumとExcelVBAの組み合わせは、情報が少なくて開発に手間取ります。マイナーなんでしょうね。それでも一部の人たちにニーズはあると思うので、気が付いたことがあれば記事にしていこうと思います。

おまけ

今回作ったコード。例によって知恵袋で質問があったものです。

サイトからスクレイピングするにあたって、CSSセレクタをどうしたらよいかという質問でした。

Public Sub GetImgSrc()    
    Dim driver As Object
    Set driver = CreateObject("Selenium.Webdriver")
    driver.Start BROWSER_NAME
    driver.Get "https://www.lightup.jp/detail/336336.html"
    '動的に表示する内容を変えているかもしれないので、最大情報量をゲットするためにも最大化する
    driver.Window.Maximize
    driver.Wait 1000    'スクレイピングのお作法。相手方サーバに負荷をかけないよう、長めに待つ。
    
    Dim brands As Object 'sがついていることに注意。複数形。
    Set brands = driver.FindElementsByCss("figure.item-ph > img")
    
    '添え字の件数分調査する
    Dim lbrandsCnt As Long
    lbrandsCnt = brands.Count   '・・・【 A 】
    
    Dim ws As Worksheet
    Set ws = ActiveWorkbook.ActiveSheet
    
    Dim j As Long
    For j = 1 To lbrandsCnt
        ws.Range("A" & j + 4).Value = j
        ws.Range("F" & j + 4).Value = brands.Item(j).Attribute("src")
    Next j
        
    Set brands = driver.FindElementsByCss("div.item-brand")
    lbrandsCnt = brands.Count       '・・・たまたま今回この件数が【 A 】の件数と一致しており、他にこのセレクタで抽出される要素がなかった。
    For j = 1 To lbrandsCnt
        ws.Range("B" & j + 4).Value = brands.Item(j).Attribute("innerText")
    Next j
    
    driver.Close
    Set driver = Nothing
    Set brands = Nothing
    Set ws = Nothing
End Sub