エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。

前回の記事はこちら。

エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
エクセルVBAでIEを操作する便利なクラスの作り方をお伝えしています。今回は、エクセル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タグ内にあって、ディスクリプションとか、キーワードとかが設定されています。

Webページのmetaタグ

同じ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メソッドです。

HTMLDocumentオブジェクト.getElementsByName(name属性)

Property GetプロシージャContentByNameに渡されたパラメータnameAttrがname属性を表します。

ただ、getElementsByNameメソッドはコレクションを返すので、インデックス0を指定して最初の要素を指定しています。

今回欲しいディスクリプションとか、キーワードとかは、おそらく同じname属性を持つ要素はないだろうし、あったとしても先に欲しいものが記述されている…と踏んでいます(ダメなときがあったらごめんなさい)。

contentプロパティでcontent属性の値を取得

それで、目的の要素にたどりつきますので、contentプロパティでcontent属性の値を取り出します。

HTMLMetaElementオブジェクト.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

実行すると、以下のようにディスクリプションとキーワードが出力されます。

Webページのディスクリプションとキーワードを出力

まとめ

以上、エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティの作り方をお伝えしました。

引数を渡していろいろな要素から取得できるように汎用的に作っておくと便利ですよね。

次回は別の要素の取得をするメンバーを作っていきます。

エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。今回は、エクセルVBAでIEを操作するクラスに、リンクテキストでa要素を探して取得するメソッドを追加していきます。

どうぞお楽しみに!

連載目次:エクセルVBAでIEを操作するクラスを作る

エクセルVBAでInternetExplorerを操作してWebスクレイピング、まだまだ現役で必要となる現場もあるでしょう。このシリーズでは、IEを使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。
  1. エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
  2. エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
  3. エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
  4. エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
  5. エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
  6. エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
  7. エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
  8. エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
  9. エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
  10. エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する

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