みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。
前回の記事はこちら。
IEで開いているページのHTMLドキュメントを読み込み待ち込みで取得する方法をお伝えしました。
さて、実際には、そのドキュメントから要素やその内容を取得していくというのが目的になりますね。
今回は、その中でもname属性から要素を取得して内容を取り出すプロパティを作っていいます。
ということで、エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティの作り方です。
では、行ってみましょう!
前回のおさらい
まず、前回のおさらいからです。
IEを操作するクラスIEObjectの内容はこちらです。
Public IE As InternetExplorer
Public Document As HTMLDocument
Private Sub Class_Initialize()
Set IE = New InternetExplorer
IE.Visible = True
End Sub
Private Sub Class_Terminate()
IE.Quit
End Sub
Public Sub Navigate(ByVal url As String)
IE.Navigate url
Wait
Set Document = IE.Document
End Sub
Public Sub Wait()
Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub
NavigateメソッドがIEでWebページを開く処理ですが、そこにHTMLドキュメントの取得やら、読み込み待ちやらの処理を入れてますね。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
ieObj.Navigate "https://tonari-it.com"
Debug.Print ieObj.Document.Title
End Sub
ですから、標準モジュールではNavigateメソッドを一発入れるだけで、アクセスと読み込み待ちとドキュメントの取得をまとめてやってくれちゃうわけです。
クラス…いいですね!
name属性で要素を取得して、その要素のcontent属性を返すプロパティ
では、具体的に要素を取得していきます。
まず、Webページのmetaタグから任意のページの情報を取得するプロパティを作ってみましょう。
metaタグはWebページのHeadタグ内にあって、ディスクリプションとか、キーワードとかが設定されています。
同じmetaタグなのですが、name属性などの属性で役割が異なります。そして、その内容はcontent属性に含まれています。
そこで、こういうプロパティはどうでしょう?
name属性で要素を取得して、その要素のcontent属性を返すプロパティです。
Public Property Get ContentByName(ByVal nameAttr As String) As String
ContentByName = Document.getElementsByName(nameAttr)(0).Content
End Property
値を返すのでFunctionプロシージャが頭に浮かびますが、とくにクラスに対して処理を行うわけではなく、値を取得するだけなのでProperty Getプロシージャで作りました。
getElementsByNameメソッドでname属性でHTML要素を取得
まず、HTMLドキュメントからname属性でHTML要素を取得するのが、getElementsByNameメソッドです。
Property GetプロシージャContentByNameに渡されたパラメータnameAttrがname属性を表します。
ただ、getElementsByNameメソッドはコレクションを返すので、インデックス0を指定して最初の要素を指定しています。
今回欲しいディスクリプションとか、キーワードとかは、おそらく同じname属性を持つ要素はないだろうし、あったとしても先に欲しいものが記述されている…と踏んでいます(ダメなときがあったらごめんなさい)。
contentプロパティでcontent属性の値を取得
それで、目的の要素にたどりつきますので、contentプロパティでcontent属性の値を取り出します。
IEを操作してディスクリプションとキーワードを取得する
では、動作を確認してみましょう。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
ieObj.Navigate "https://tonari-it.com"
Debug.Print ieObj.ContentByName("description")
Debug.Print ieObj.ContentByName("keywords")
End Sub
実行すると、以下のようにディスクリプションとキーワードが出力されます。
まとめ
以上、エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティの作り方をお伝えしました。
引数を渡していろいろな要素から取得できるように汎用的に作っておくと便利ですよね。
次回は別の要素の取得をするメンバーを作っていきます。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作するクラスを作る
エクセルVBAでInternetExplorerを操作してWebスクレイピング、まだまだ現役で必要となる現場もあるでしょう。このシリーズでは、IEを使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。- エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
- エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
- エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
- エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
- エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
- エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
- エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
- エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する