【ExcelVBA】SeleniumでinnerText
- [記事公開]2023.03.03
- VBA
- ExcelVBA, SeleniumBasic
Excel VBAにおいてSelenium BasicでinnerTextをとってくる方法が分かったので、自分用に記事にします。
innerTextはTextで代用できる
Selenium BasicではinnerTextを使わなくてもTextで代用できます。たとえば、こんな感じ↓
ws.Range("B" & j + 4).Value = brand.TextbrandはWebElement型の変数です。
ところが、これでは値をとってこれない場合がありました。
Textではうまくいかなかった例
こういう横にスクロールするサイトがその例です。


図にあるようなテキストをVBAでSeleniumを介してとってこようとしたところ、画面に表示されていない要素のテキストはブランクとなりました。
なんで?と調べたら、CSSで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- 
            前の記事  大岡裁きはない 2023.03.02
- 
            次の記事  【ChatGPT】要約に便利 2023.03.04