【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする


name

photo credit: Writing My Name In The Sand via photopin (license)

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

初心者向けエクセルVBAでIEを操作するシリーズも、もう5回目になりました。

なのですが、まだ全然序の口ですね…。まだしばらく続きそうですから、末永くお付き合いください。

さて、前回はコチラの記事。

【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
初心者向けエクセルVBAでIEを操作するシリーズの第4回目です。今回はLinksとFor Each~Nextという繰り返し処理を用いてページ内のリンク先URLを全て取得する方法についてお伝えします。

ページ内に存在しているリンク先URLをまとめて取得する方法についてお伝えしました。

今回のお題はSEOでとても重要な役割を果たす「ディスクリプション」。

ディスクリプションとは何か、そしてmetaタグの役割なども踏まえつつ、まさにgetElements~といった命令を使うことで、ページ内からディスクリプションを取得していきたいと思います。

スポンサーリンク

ディスクリプションとは何か

まずディスクリプションとは何かという話ですが、アルファベットではdescriptionと書き、日本語としては「説明」とか「解説」とかいった訳になります。

その名の通り、そのページの説明書きを表す部分でして、例えばGoogleで検索した結果で
いうと

Google検索結果のディスクリプション

この部分に表示されるものです。

SEOでも非常に重要な役割を果たしていまして、Googleのクローラーはこのディスクリプションに記載されているキーワードを重要視して検索結果の順位を決めています。

ちなみに一般的にはディスクリプションの文字数は60~100文字程度が推奨されています。

たまーに、このディスクリプションがスカスカなサイトを見受けますが、たいがいとっても損をしています。

ディスクリプションの書き方

そのディスクリプションはどのようにページのHTMLに記載されているかを見ていきたいと思います。

GoogleChromeなら以下ショートカットが便利なので覚えておきましょうね。

Ctrl + UページのHTMLソースをタブで開く

Ctrl + Fページ内のキーワードを検索する

Ctrl + Gページ内の検索結果の次へ移動する

ではHTMLソースから「description」を探すと

HTMLソースからdescriptionを検索

ここにいましたね。小さくて見づらいですね。その箇所を拾ってきますと


このように記述されています。

書き方としては「<meta name=”description” content=”~”>」という書き方で、いわゆるmetaタグ内のcontent属性の中に記載して指定をします。

mataタグとはメタ情報つまりそのページをつかさどる色々な項目を指定するためのタグで、ディスクリプション以外にも、言語や文字コードの設定など種類があります。

エクセルVBAでディスクリプションを取得する

ではエクセルVBAを使って、このディスクリプションを取得していきたいと思います。

getElementsByNameメソッドでname属性からHTML要素を取得

繰り返しになりますが、ディスクリプションはname属性でdescriptionとされているmetaタグ内のcontent属性内にあります。

エクセルVBAにはこのname属性でHTML要素を拾ってくる命令getElementsByNameメソッドという長いやつがありまして

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

これで取得することができます。この結果は単一の要素ではなくて、要素のコレクションになりますので、それを格納する場合は

Dim オブジェクト変数名 As IHTMLElementCollection

と、IHTMLelementCollectionというオブジェクトを用意します。なぜか頭文字として’I’がついているので注意してくださいね。

今回の場合、name属性としてdescriptionを探したいわけですから、取得したコレクションを格納する変数をelementsとしますと

Dim elements As IHTMLElementCollection
Set elements = htmlDoc.getElementsByName("description")

となります。

コレクションからインデックスで要素を取り出しさらに属性を取り出す

まず、取得した要素はHTMLMetaElementになりますが、そのcontent属性を取り出すには、contentプロパティを使います。

HTMLMetaElementオブジェクト.Content

ですが、これは単一の要素についてでないとききません。

先ほどgetElementsByNameで取得したものはコレクションつまり集合ですから、コレクションから要素を取り出してからディスクリプションを取り出すという手順になります。

前回のように「For Each~Next」を使ってコレクション内の全ての要素について取り出してくるという方法もあるはあるのですが

Dim element As IHTMLElement 'IHTMLエレメントオブジェクトを準備
For Each element In elements
 '処理
Next element

name属性がdescriptionのmetaタグはどうせ1つしかありませんから、なんだか冗長ですよね。

別の書き方として、こんな書き方もできます。

コレクション(0).Content

コレクションの後に括弧、そしてその中にインデックス番号を数字で入れます。上記の場合は、「コレクションの0番目の要素」という意味になります。

このコレクションのインデックスはHTMLドキュメントで先に登場した順に0から採番されていきます。

ですから、原則1つしかない要素は、何も考えずともコレクションの0番目の指定で取り出せるわけです。

このコレクションとインデックスについては、覚えておくとかなり使えますよ!

さて、コレクションの0番目の要素からcontent属性をデバッグ表示する場合

Debug.Print elements(0).Content

となります。

今回のプログラムのまとめはこうなります。

Sub MySub()

    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    
    objIE.Visible = True
    objIE.Navigate "https://tonari-it.com/"
    
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.Document
    
    Dim elements As IHTMLElementCollection
    Set elements = htmlDoc.getElementsByName("description")
    Debug.Print elements(0).Content

End Sub

実行してみますと

エクセルVBAでディスクリプションを取得して出力

このようにディスクリプションが表示されます。

まとめ

前述のプログラムですが「Set htmlDoc = ~」までは前回と同じで、今回たった3行追加しただけなのですが

  • getElementsByNameメソッドでname属性からコレクションを拾ってくる
  • コレクションのインデックスで要素を指定する
  • 要素からcontent属性の内容を取り出す

などなど、エクセルVBAにおけるWEBスクレイピングで非常に重要なポイントが凝縮されています。

このgetElementsByNameメソッドなのですが、NameだけでなくてTag、IDなどいくつかのバリエーションというか仲間たちがいますので、次回以降紹介できればと思います。

【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
エクセルVBAでIEを操作する初心者向けのシリーズの6回目です。今回はタグ名で要素をゴソっと取得するgetElementsByTagNameの使い方です。様々なHTML要素を簡単に取得できます。

どうぞお楽しみに!

連載目次:エクセルVBAでIEを操作してWEBスクレイピング

IEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。

  1. 【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
  2. 【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
  3. 【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
  4. 【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
  5. 【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
  6. 【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
  7. 【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
  8. 【エクセルVBAでIE操作】WEBページのテーブル要素からセルのデータを取り出す方法
  9. 【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
  10. 【エクセルVBAでIE操作】検索結果一覧から記事タイトルを取得する方法
  11. 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
  12. 【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する
  13. 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする
  14. 【エクセルVBAでIE操作】name属性を利用して画像ボタンをクリックする
  15. 【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする

コメント

  1. SGO より:

    先日はどうもありがとうございました!
    (ただのお知らせですので、もちろん非公開で結構ですので、こっそり直されて頂ければと思いました。。)
     ご著書も順調そうで、何よりです。
     今は、仕事で使うのに、このhtmlシリーズで勉強させてもらっています。
     このシリーズをしてもらっていなかったら、一生知らないままで、無駄な作業を繰り返していたと思います!!

     このページの中央当たりのコードで、タグが外れていましたので、お知らせいたします。
     ご参考ください。(「コレクション(0).Content」の下です。)
     これからも楽しみにしています!

    [crayon-590d5c4ad5d79124938827 ]DoEvents

    Loop

    Dim htmlDoc As HTMLDocument ‘HTMLドキュメントオブジェクトを準備
    Set htmlDoc = objIE.document ‘objIEで読み込まれているHTMLドキュメントをセット

    Dim colDes As IHTMLElementCollection ‘IHTMLエレメントコレクションを準備
    Set colDes = htmlDoc.getElementsByName(“description”) ’htmlDoc内のname属性descriptionの要素をコレクションとして取得

    Debug.Print colDes(0).Content ’コレクションの最初の要素をデバッグ表示

    End Sub
    [/crayon]

  2. SGO より:

    追伸)
    「『‘』objIEで読み込まれているHTMLドキュメントをセット」
    のところが、[‘]と違っていましたので、もし良ければ、そちらもどうぞ。

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