こんにちは、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)
コメント