スポンサーリンク

【SeleniumBasic】VBAスクレイピングによるテキストの取得方法について説明します

こんにちは、blueです。

  • サイト表示はできるようになったけど思ったテキストが取得できない
  • 表示されているテキストがHTMLの中にない

こういった悩みを持つ方はいらっしゃるのではないでしょうか?

ここではサイトに表示されるテキストの取得方法について3つ紹介します。

どの方法もメソッドを理解するだけで扱えるようになりますのでぜひ勉強していってください。

VBAを使ったものではありませんが、Seleniumを勉強する為の基本的な書籍です。ブラウザやキー操作の基本的なコマンドは共通していますのでコードを書く際の参考になります。

VBAの書籍の中でSeleniumBasicを取り上げている数少ない書籍ですページ数としては20ページほどですがとてもわかりやすく書かれています。またVBA全般を網羅した内容が書かれており、長く使用することができます。

スポンサーリンク

今回の内容

今回紹介する内容は以下3つです。

  • HTMLに表示されているテキストを取得する
  • HTMLに表示されていないテキストを取得する
  • ポップアップウィンドウに表示されているテキストを取得する

以下で詳しく説明します。

HTMLに表示されているテキストを取得する

まずはHTMLに表示されているテキストの取得方法から説明します。
例としてYahooのニュース見出しのテキスト取得を挙げます。

クリックすると拡大します

HTMLに表示されているテキストとはHTMLのタグ(<>や</>)の間に記載されている要素の内容のことですデベロッパーツールでは以下の様に表示されています。
デベロッパーツールの使い方についてはこちら

クリックすると拡大します

HTMLについての詳しい内容はこちら

これらはTextメソッドで取得することができます。
コードは以下になります。

  • Driver..FindElementBy〇〇〇(“”).Text

ちなみにTextメソッドでタグ内にあるすべての要素の内容を取得することできます
以下のコードではtabpanelTopicsというID内に存在するすべてのTextを取得し、イミディエイトウィンドウに表示しています。

クリックすると拡大します
Sub Yahooテキスト取得()

    Dim Driver As New Selenium.WebDriver

    Driver.Get "https://www.yahoo.co.jp/"

    Debug.Print Driver.FindElementById("tabpanelTopics1").Text
    
End Sub

結果として以下の情報を取得することができます。

クリックすると拡大します

HTMLに表示されていないテキストを取得する

次にHTMLに表示されていないテキストの取得方法として、プロパティからの取得方法について説明します。

例としてDeepLの翻訳部分の取得について考えます。

クリックすると拡大します

入力部分に「今日はいい天気ですね」といれると、翻訳部分に「It’s a beautiful day」と表示されますが、HTMLタグ内にテキスト内容は表示されていません
(以下右のHTML文内にIt’s a beautiful dayと書かれていないことが分かると思います)

クリックすると拡大します

これが表示されている部分がデベロッパーツールのプロパティになります。

デベロッパーツールの下半分に書かれています。

クリックすると拡大します

このプロパティはJavaScriptによって生成されたものでTextメソッドでは取得できません

このテキストの取得方法は2種類あります。

AttributeメソッドJavaScriptによる記述です。

JavaScriptに関する記事はこちら

  • Driver..FindElementBy〇〇〇(“”).Attribute(“属性名”)
  • Driver.ExecuteScript(“return document.getElementByID(”).プロパティ名;”)

上記の例では属性名やプロパティ名はvalueとなります
具体的なコードは以下になります(コードが長いのはCss取得によるものなのでご了承下さい)。

Sub DeepL翻訳_翻訳文取得()
    Dim Driver As New Selenium.WebDriver
    SafeOpen Driver, Chrome
    
    Driver.Get "https://www.deepl.com/ja/translator"
    
    Driver.FindElementByCss("#panelTranslateText > div > div.lmt__sides_wrapper > section.lmt__side_container.lmt__side_container--source > div.lmt__textarea_container > div.lmt__inner_textarea_container > textarea").SendKeys "今日はいい天気ですね"

    Debug.Print Driver.FindElementByCss("#panelTranslateText > div > div.lmt__sides_wrapper > section.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container.lmt__raise_alternatives_placement > div.lmt__inner_textarea_container > textarea").Attribute("value")

    Debug.Print Driver.ExecuteScript("return document.querySelector('#panelTranslateText > div > div.lmt__sides_wrapper > section.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container.lmt__raise_alternatives_placement > div.lmt__inner_textarea_container > textarea').value;")

End Sub

ポップアップウィンドウのテキストを取得する

最後にポップアップウィンドウに表示されたテキストの取得方法について説明します。

例として以下のサイトで表示されるポップアップウィンドウのテキストを考えます。

クリックすると拡大します

ポップアップウィンドウはJavaScriptによって生成されており、2つ目と同様にTextメソッドでは取得できません。
ただSeleniumにはポップアップウィンドウのテキストを取得する方法としてSwitchToAlert.Textメソッドが用意されています。

  • Driver..SwitchToAlert.Text

先ほどのサイトでポップアップウィンドウの「アラートの表示」を取得するコードは以下になります。

Sub ポップアップウィンドウのテキスト取得()
    
    Dim Driver As New Selenium.WebDriver
    Driver.Start "Chrome"
    
    Driver.Get "https://www.tagindex.com/javascript/window/alert1.html"

    Driver.FindElementByCss("#content > section.overview > figure > p > input[type=button]").Click
    
    Debug.Print Driver.SwitchToAlert.Text
    
End Sub

まとめ

今回は

  • HTMLに表示されているテキストの取得方法
  • JavaScriptのプロパティに表示されているテキストの取得方法
  • ポップアップウィンドウのテキスト取得方法

について説明しました。テキスト取得はスクレイピングの醍醐味ですのでぜひ扱えるようになってください。

VBAを使ったものではありませんが、Seleniumを勉強する為の基本的な書籍です。各言語における基本的なメソッド一覧も記載されていますのでコードを書く際の参考になります。

VBAの書籍の中でSeleniumBasicを取り上げている数少ない書籍です。ページ数としては20ページほどですがとてもわかりやすく書かれています。またVBA全般を網羅した内容が書かれており、長く使用することができます。

SeleniumBasicでのWebスクレイピングに関する記事はこちらをどうぞ

Web-APIを用いたデータ取得に関する記事はこちらをどうぞ

【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1
【API-VBA】Web APIを使って翻訳をする(DeepL API)

コメント

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