【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.Text
brandは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