みなさん、こんにちは!タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAでIEを操作するシリーズも、もう5回目になりました。
なのですが、まだ全然序の口ですね…。まだしばらく続きそうですから、末永くお付き合いください。
さて、前回はコチラの記事。
ページ内に存在しているリンク先URLをまとめて取得する方法についてお伝えしました。
今回のお題はSEOでとても重要な役割を果たす「ディスクリプション」。
ディスクリプションとは何か、そしてmetaタグの役割なども踏まえつつ、まさにgetElements~といった命令を使うことで、ページ内からディスクリプションを取得していきたいと思います。
ディスクリプションとは何か
まずディスクリプションとは何かという話ですが、アルファベットではdescriptionと書き、日本語としては「説明」とか「解説」とかいった訳になります。
その名の通り、そのページの説明書きを表す部分でして、例えばGoogleで検索した結果で
いうと
この部分に表示されるものです。
SEOでも非常に重要な役割を果たしていまして、Googleのクローラーはこのディスクリプションに記載されているキーワードを重要視して検索結果の順位を決めています。
ちなみに一般的にはディスクリプションの文字数は60~100文字程度が推奨されています。
たまーに、このディスクリプションがスカスカなサイトを見受けますが、たいがいとっても損をしています。
ディスクリプションの書き方
そのディスクリプションはどのようにページのHTMLに記載されているかを見ていきたいと思います。
GoogleChromeなら以下ショートカットが便利なので覚えておきましょうね。
Ctrl + U:ページのHTMLソースをタブで開く
Ctrl + F:ページ内のキーワードを検索する
Ctrl + G:ページ内の検索結果の次へ移動する
ではHTMLソースから「description」を探すと
ここにいましたね。小さくて見づらいですね。その箇所を拾ってきますと
このように記述されています。
書き方としては「<meta name=”description” content=”~”>」という書き方で、いわゆるmetaタグ内のcontent属性の中に記載して指定をします。
mataタグとはメタ情報つまりそのページをつかさどる色々な項目を指定するためのタグで、ディスクリプション以外にも、言語や文字コードの設定など種類があります。
エクセルVBAでディスクリプションを取得する
ではエクセルVBAを使って、このディスクリプションを取得していきたいと思います。
getElementsByNameメソッドでname属性からHTML要素を取得
繰り返しになりますが、ディスクリプションはname属性でdescriptionとされているmetaタグ内のcontent属性内にあります。
エクセルVBAにはこのname属性でHTML要素を拾ってくる命令getElementsByNameメソッドという長いやつがありまして
これで取得することができます。この結果は単一の要素ではなくて、要素のコレクションになりますので、それを格納する場合は
と、IHTMLelementCollectionというオブジェクトを用意します。なぜか頭文字として’I’がついているので注意してくださいね。
今回の場合、name属性としてdescriptionを探したいわけですから、取得したコレクションを格納する変数をelementsとしますと
Dim elements As IHTMLElementCollection
Set elements = htmlDoc.getElementsByName("description")
となります。
コレクションからインデックスで要素を取り出しさらに属性を取り出す
まず、取得した要素はHTMLMetaElementになりますが、そのcontent属性を取り出すには、contentプロパティを使います。
ですが、これは単一の要素についてでないとききません。
先ほどgetElementsByNameで取得したものはコレクションつまり集合ですから、コレクションから要素を取り出してからディスクリプションを取り出すという手順になります。
前回のように「For Each~Next」を使ってコレクション内の全ての要素について取り出してくるという方法もあるはあるのですが
Dim element As IHTMLElement 'IHTMLエレメントオブジェクトを準備
For Each element In elements
'処理
Next element
name属性がdescriptionのmetaタグはどうせ1つしかありませんから、なんだか冗長ですよね。
別の書き方として、こんな書き方もできます。
コレクションの後に括弧、そしてその中にインデックス番号を数字で入れます。上記の場合は、「コレクションの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
実行してみますと
このようにディスクリプションが表示されます。
まとめ
前述のプログラムですが「Set htmlDoc = ~」までは前回と同じで、今回たった3行追加しただけなのですが
- getElementsByNameメソッドでname属性からコレクションを拾ってくる
- コレクションのインデックスで要素を指定する
- 要素からcontent属性の内容を取り出す
などなど、エクセルVBAにおけるWEBスクレイピングで非常に重要なポイントが凝縮されています。
このgetElementsByNameメソッドなのですが、NameだけでなくてTag、IDなどいくつかのバリエーションというか仲間たちがいますので、次回以降紹介できればと思います。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作してWEBスクレイピング
IEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。
- 【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
- 【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
- 【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
- 【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
- 【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
- 【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
- 【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
- 【エクセルVBAでIE操作】WEBページのテーブル要素からセルのデータを取り出す方法
- 【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
- 【エクセルVBAでIE操作】検索結果一覧から記事タイトルを取得する方法
- 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
- 【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する
- 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする
- 【エクセルVBAでIE操作】name属性を利用して画像ボタンをクリックする
- 【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする
コメント
先日はどうもありがとうございました!
(ただのお知らせですので、もちろん非公開で結構ですので、こっそり直されて頂ければと思いました。。)
ご著書も順調そうで、何よりです。
今は、仕事で使うのに、この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]
SGOさん
ご指摘ありがとうございます!お恥ずかしい…!
修正をさせて頂きました。いつもありがとうございます。
追伸)
「『‘』objIEで読み込まれているHTMLドキュメントをセット」
のところが、[‘]と違っていましたので、もし良ければ、そちらもどうぞ。
SGOさん
こちらも修正しました!
助かります!