みなさん、こんにちは!タカハシ(@ntakahashi0505)です。
引き続きの初心者向けエクセルVBAでIEを操作するシリーズです。今回は第6回目ですよ。
前回はこちらの記事。
getElementsByNameを使って、WEBページのディスクリプションを取得する方法をお伝えしました。
name属性は要素に名前を設定するための属性なので、ピンポイントで要素を取得したいときには使い勝手が良いです。
しかしながらサイトや取得したい要素によってはname属性が付与されておらず、目的のものを探り当てられない場合も少なくありません。
そんなときにはタグ名でつかんでしまえばOKです。
今回はgetElementsByTagNameで特定のHTML要素をタグ名で取得する方法についてお伝えします。
実際に、WEBスクレイピングをする際にはかなりの頻度でお世話になりますよ。
では早速いってみましょう!
今回はhタグを取得してみます
WEBページの要素をタグ名で取得する方法をお伝えしていきます。お題として見出しに使うhタグを使ってみましょう。
hタグとは
<h1>~<h6>のhとはHeadingの略で、見出しを意味します。 <h1>が最上位の見出し(大見出し)で、以下数字が小さくなるにつれて下位の見出し(小見出し)となります。 <h6>が最下位の見出しです。
とのことです。
書籍などでは見出しはとても大事ですよね。見出しがあることで、文章の構造が把握できるようになります。
WEBページでも非常に重要な役割をはたしていまして、読者も該当のページを構造的に読みやすくなるというメリットも当然ありますし、さらにはGoogleのクローラーもhタグの構造を重視して評価や分析をしているのでSEOの視点でも重要です。
hタグを上手に使えていると、人にも機械にも優しいWEBページになるということですね。
書き方としては他のHTML要素と同様に「<h1>~</h1>」という形でタグの間に表示するテキストを挟む書き方です。
HTML要素に関してはこちらの記事に詳しく書いていますので、ご覧いただければと思います。
getElementsByTagNameメソッドでタグ名で要素を取得
タグ名でHTML要素を拾ってくる際はgetElementsByTagNameメソッドを使います。
相変わらず文字数が長いですが、正直、前回お伝えしたname属性で取得するよりもシンプルです。
getElementsByNameメソッドと同様、単一の要素ではなくて要素のコレクションとして取得します。
例えば、HTMLドキュメントオブジェクトがhtmlDocで、h1要素をコレクションとして取得する場合は
Dim header1s As IHTMLElementCollection
Set header1s = htmlDoc.getElementsByTagName("h1")
とすることで、取得したh要素がコレクションとしてheader1sに格納されます。
innerTextプロパティでタグ内のテキストを取得する
では、取得したhタグの中身を取り出したいと思います。
取得したタグ要素内のテキストを取得する場合は、innerTextプロパティを使って
と書きます。”中のテキスト”ということですね。
これを使って、先ほど取得したhタグコレクションを全てイミディエイトウィンドウに出力します。
コレクションのループをしますので、例えば変数header1sなどを用意せずとも以下のように書けますね。
Dim element As IHTMLElement
For Each element In htmlDoc.getElementsByTagName("h1")
Debug.Print element.innerText
Next element
WEBスクレイピングの際は、このようにgetElementsBy~でコレクションでHTML要素をコレクションで取得する仕方を本当にたくさん使いますので、ぜひ使いこなせて頂ければと思います。
最後にまとめとして、h1~h3タグを全て取得してイミディエイトウィンドウに出力するプログラムを書いておきますね。
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 element As IHTMLElement
Debug.Print "■h1"
For Each element In htmlDoc.getElementsByTagName("h1")
Debug.Print element.innerText
Next element
Debug.Print "■h2"
For Each element In htmlDoc.getElementsByTagName("h2")
Debug.Print element.innerText
Next element
Debug.Print "■h3"
For Each element In htmlDoc.getElementsByTagName("h3")
Debug.Print element.innerText
Next element
End Sub
「Set htmlDoc=~」まではこれまでと同じですので、必要に応じて復習してみて下さいね。
まとめ
今回はgetElementsByTagNameメソッドで特定のタグ要素をコレクションとして取得する方法についてお伝えしました。
繰り返しになりますが、HTMLはタグ要素の連続でできていますから、理論上は今回の方法で、全てのHTML要素にアクセスすることができるようになります。
また、要素内のテキストを取り出すinnerTextについてもお伝えしました。これも非常に高い頻度で活用しますので、よく覚えて頂ければと思います。
次回はテーブル要素を取得する方法についてお伝えしています。
どうぞお楽しみに!
連載目次:エクセル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属性を利用して画像ボタンをクリックする
コメント
いつもどうもありがとうございます。
すみません。
最後のまとめプログラムを「JR東日本」に変えて実行しますと、次のような結果になりました。
■h1
■h2
コンテンツメニュー
JR東日本各種サービス
■h3
「ctrl+U」で確認してみますと、以下のものだけを抜いているようなのですが、問題ないでしょうか?
コンテンツメニュー
JR東日本各種サービス
◆ 例えば、次のh2タグは抜かないものでしょうか?
(あまりお話を理解していない質問だと思いますが、、、)
もし良かったら教えて頂ければありがたいです。よろしくお願いします。
SGOさん
コメントありがとうございます!
現在のJR東日本のページですと、おっしゃる出力が正しいものと思います。
テキストが出力されたもの以外のh1,h2,h3タグも存在しているのですが、aリンクだったり、img画像だったりしますので、innerTextプロパティでは取り出すことができません。
もし、aタグやimgタグなども含めてHTMLを取り出すのであれば、innerHTMLプロパティを使って
とすればタグも含めて取り出すことができます。
大変わかりやすい説明に、いつも助けられております。
ちょっと気になったもので、質問させてください。
変数の宣言は、型の指定を省略するとVariant型になると理解していました。
そのため、
Dim i, j As Long
などと書くと、Long型になるのはjだけで、iはVariant型扱いになるとどこかで読んだ記憶があります。
ソース18行目に
Dim colH1, colH2, colH3 As IHTMLElementCollection
とありますが、この場合は該当しないのでしょうか?
プログラム自体は問題なく動くので、Variant型でも別に構わないということなのでしょうか。
細かいですが、ご解説いただければ幸いです。
Pen Guinさん
コメントありがとうございます!
確かに…おっしゃる通りですね。ご指摘助かります…
修正させていただきました。
今後とも当ブログをどうぞよろしくお願いいたします。