要素の有無を確認する事で実行時エラー7を回避
まずはコードの紹介です。IsElementPresentメソッドを使います。
今回は引数にXPathを使って要素の確認をしています。
これでWebページ内に指定要素が存在するのかチェックしてからコードを分岐する事ができます。
Sub 要素の存在確認()
Dim dvr As New ChromeDriver
Dim by As New by
With dvr
.Start "chrome"
.Get "https://www.yahoo.co.jp/"
If .IsElementPresent(by.XPath("実際のXPath")) = True Then
'要素が確認できた時の処理
Else
'要素が確認できなかった時の処理
End If
End With
End Sub
指定要素があればIfとElseの間のコードが実行されます。
指定要素が無い時にはElseとEnd Ifの間のコードが実行されます。この構成で実行時エラー7を回避します。
使用例としてはTrueの方にクリックメソッド含んだコードを用意してみます。
これで指定の要素が確認できた時だけその要素をクリックする事ができますよ。
そもそも何故指定要素の存在をチェックしないといけないのでしょうか?
理由は指定した要素が無いとエラーになりコードが止まってしまう為です。これが実行時エラー7の理由です。
もう1つ理由があります。以降で解説していきます。
最後にIsElementPresentメソッドを使ったコードの作り方のヒントを用意しています。
この記事を読むとわかる事
3点です。要素があるかを確認するにはIsElementPresentメソッド1択です。
- IsElementPresentメソッドの使い方
- 実行時エラー7とは
- コードの作り方のヒント
Enjoy Excel
関連記事
ウインドウの切り替えは要素の存在を確認する際にも関連する要素です。
要素の存在に似ている考え方で要素が選択されているのかを確認するケースがあります。
ラジオボタンの説明&選択状態をチェックする事ができるコードを紹介しています。
ラジオボタンの取扱説明書Selenium×ExcelVBA|ラジオボタンの選択状態をチェックする方法
IsElementPresentメソッド
このメソッドの引数に設定した要素がWebページ内に存在するのかを確認してくれます。
引数と戻り値についてはオブジェクトブラウザーを参考にしてください。
画像はChromeDriverクラス内のISElementPresentメソッドを指しています。
EdgeやFirefoxなど他のブラウザー用のクラス(オブジェクト)にも搭載されています。
引数はByクラス(オブジェクト)を用意します。戻り値はBooleanなのでTrueかFalseが返ってきます。
Byクラスで指定した要素がWebページ内に存在するとTrueが返ります。Falseはその逆ですね。
Byクラスで指定できる要素はこちらです。ここでは各要素の説明は割愛させていただきます。
このメソッドを使えば指定要素が無い時にエラーを回避できます。
具体的には「実行時エラー7」を回避します。
実行時エラー7とは
続いて「実行時エラー7」について解説していきます。
このエラーは「コード内で掴んでいるWebページ内に指定した要素が無い」という意味です。
メッセージボックスの後半の文字列を確認してみましょう。
Element not found for 要素 = タグやパス
太字の要素というところにコード内で指定した要素が入ります。
同じく太字のタグやパスのところにコード内で指定した要素の引数が入ります。
画像は○○(モザイク処理しています)というキーワードを設定したNameタグを探した結果です。
「○○という名前のNameタグは無い=実行時エラー7」となりメッセージボックスが表示されています。
要素が無いという事があり得るのか
1つ目の理由である実行時エラー7については理解できました。しかし前提条件が理解出来ません。
自分でコードを書いておいてWebページ内に「要素が無い」なんて事があるのでしょうか。
普通はコードを書く時に気付きますよね。イマイチ納得がいきません。
・・・実はあり得るんですよ。すぐに思いつくのはこの2つです。
- Webページの構成が変わった時
- Webページから情報が無くなった時
コード作成時を起点にして対象のWebのページに変化があった際は指定要素が無いという事象が起こり得ます。
そういった時はコードをメンテナンスするしかないのですがこれでは解決しない事例があります。
都度指定した要素のチェックが必要な記事
ここからは指定要素の存在をチェックしないといけない2つ目の理由について解説していきます。
「URLによっては都度指定した要素の存在をチェックする必要がある為」です。
例えばYahoo!Japanのニューストピックスでコメント数を取得したい場合です。
以下画像の中にはコメント数に関して3種類の情報があります。(本当はもう1種あるので計4種です)
ここからはXPathが理解出来てないと読めないです。XPathについての解説記事はこちら。
よってXPathが理解できている体で話を進めます。
Yahooのニューストピックスの記事はリアルタイムで変化していきます。
よって記事含めコメント数にはNameタグやIdタグを使って情報を取得するのは難しいです。
NameタグやIdタグが使えないのであればコメント数を取得する際はXPathを使う事になります。
しかし記事によって「コメント数の位置×コメント数の有無」で4種類のパスが必要になります。
こうなるともパスも複数になってしまうのでXPathも定まりません。
- 記事の直下にコメント数無し(指定の要素がない)
- 記事の直下にコメント数有り(コメント数の要素は記事の直下のXPath)
- NEWというスタンプの後にコメント数有り(コメント数の要素はNEWの直下のXPath)
- NEWというスタンプの後にコメント数無し(画像には無いが選択肢です)
刻々と情報が変化する中でも全ての事象に対して的確にコードを用意しないとエラーが出てしまいます。
指定要素が無い時にエラーを回避する方法
XPathで毎回同じ場所の要素を取得しようとすると記事の内容によっては要素が無いのでエラーが出ます。
ここで「Ifステートメント×ISElementPresentメソッド」を使いエラーを回避しつつ要素を取得します。
- 記事の直下にコメント数無し(指定の要素がない)
- コメントを取得せずスルー
- 記事の直下にコメント数有り(コメント数の要素は記事の直下のXPath)
- コメント数を取得
- NEWというスタンプの後にコメント数有り(コメント数の要素はNEWの直下のXPath)
- NEWという要素の直下を指示したパスにあるコメント数を取得
- NEWというスタンプの後にコメント数無し(画像には無いが選択肢としては有り)
- コメントを取得せずスルー
私が実際コードを組んだ時はこのようにコードを用意する事でスクレイピングを実現しました。
以下リンク先に実際にWebスクレイピングをしている動画がありますので興味ある方はご覧ください。
動画内ではコードの詳細については説明していませんが実行時の画面の動きは見る事ができます。
参考VBAを使ってWebからデータを取得|Webスクレイピングとは?できる事を教えて
まとめ
指定した要素の存在確認が出来れば頻繁に情報が更新されるWebページの情報が取得出来る様になります。
後半のコードはヒントのみでコード自体を用意できていません。需要に応じて記事を用意します。
ISElementPresentメソッドはAttribureメソッドやFindElement系のメソッドと一緒に使うと効果抜群です。
セットで使用いただき試行錯誤する中でコードを組み立てられるようになるとどんなURLでも制覇できますよ。