トップ > 備忘録 > Webスクレイピング 3:アンカー要素のポイント

Webスクレイピング 3アンカー要素のポイント   2020.07.26

2020年時点での内容です。インターネットエクスプローラーのサポート終了に伴い、本ページのコードは現在では動作しません。記録として残しています。


前記事では、IEのDocumentオブジェクトから情報を取得した。次は、Webスクレイピングで使用されることの多い、アンカー要素についてである。この要素はリンク先を取得したり、別のページにジャンプするといったことができる。

アンカー要素:HTMLの <a> 要素。href 属性を用いて、別のウェブページ、ファイルへのリンクを作成する。

※このページのコードは、VBEの「参照設定」で「Microsoft Internet Controls」と「Microsoft HTML Object Library」が設定されていないと動作しない。詳細はこちら

ポイント

・リンク先URLの取得
・「Microsoft HTML Object Library」
・リンク先へのジャンプ
・リンク先読み込みタブの設定


アンカー要素のポイント

1.リンク先URLの取得

サンプルページを準備した。サンプルページ
サンプルページのHTMLコードは次のとおりである。


次のコードは、サンプルページの全てのアンカー要素内テキストと、リンク先を表示する。
Sample5」にアンカー要素取得とテキスト・リンクを表示するコードを追加したものである。

'標準モジュールの宣言セクションに記述
#If VBA7 Then   'Excel2010以上の場合
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else           'Excel2007以下の場合
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub Sample14() 'ページ内全ての、アンカー要素内テキストとリンク先URLを表示 Dim datWait As Date 'Date型変数(日付と時間用) Dim objIE As New InternetExplorer 'インスタンス生成 objIE.navigate "https://excel.syogyoumujou.com/memorandum/dl_file/sampleHTML.html" 'ページ読込 datWait = Now() + TimeValue("00:00:10") '10秒後の時間を格納 Do 'Do-Loop間で読込待機。 If datWait < Now() Then Exit Do '10秒以上経過したら強制終了 Call Sleep(50) '0.05秒処理を中断 Loop Until objIE.Busy = False And objIE.readyState = READYSTATE_COMPLETE objIE.Visible = True 'IEを表示 '///以下追加のコード Dim htmlAnc As HTMLAnchorElement 'HTMLアンカー要素型。「Microsoft HTML Object Library」の参照設定によって追加される型 For Each htmlAnc In objIE.Document.getElementsByTagName("a") Debug.Print htmlAnc.innerText '要素内テキスト Debug.Print htmlAnc.href 'リンクURL Next Set objIE = Nothing End Sub

●「Sample14」実行結果


このようにhrefプロパティで、リンク先を取得できる。

「Dim htmlAnc As IHTMLElement」のIHTMLElement等、HTMLに関連の型は、「Microsoft HTML Object Library」の参照設定によって追加され、設定できるようになる。
以下は、よく使われるもの。

HTMLDocumentDocument型
HTMLAnchorElement<a>要素型
HTMLDivElement<div>要素型
HTMLParaElement<p>要素型
HTMLElementCollectionHTML要素コレクション型
IHTMLElementHTML要素型
IHTMLElementCollectionHTML要素コレクション型
●「HTML」と「IHTML」の違い 参考ページ

2.リンク先へのジャンプ

リンク先にジャンプするには、アンカー要素のClickメソッドを用いる。次のコードを実行すると、サンプルページを表示し、2秒後にアンカー要素2つ目のリンク先にジャンプする。

'標準モジュールの宣言セクションに記述
#If VBA7 Then   'Excel2010以上の場合
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else           'Excel2007以下の場合
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub Sample15() 'アンカー要素を取得し、2番目のリンク先にジャンプ Dim datWait As Date 'Date型変数(日付と時間用) Dim objIE As New InternetExplorer 'インスタンス生成 objIE.navigate "https://excel.syogyoumujou.com/memorandum/dl_file/sampleHTML.html" 'ページ読込 datWait = Now() + TimeValue("00:00:10") '10秒後の時間を格納 Do 'Do-Loop間で読込待機。 If datWait < Now() Then Exit Do '10秒以上経過したら強制終了 Call Sleep(50) '0.05秒処理を中断 Loop Until objIE.Busy = False And objIE.readyState = READYSTATE_COMPLETE objIE.Visible = True 'IEを表示 '///以下追加のコード Dim htmlDoc As HTMLDocument 'HTMLDocument型。「Microsoft HTML Object Library」の参照設定によって追加される型 Set htmlDoc = objIE.Document Call Sleep(2000) '2秒待機 htmlDoc.getElementsByTagName("a")(1).Click 'アンカー要素をクリックしページジャンプ Set objIE = Nothing End Sub

3.リンク先読み込みタブの設定

リンク先へジャンプする際、現在のタブに新しいページを読み込むか、新たなタブに読み込むかは、Targetプロパティで設定する。
サンプルページは、リンク先へジャンプする際、現在のタブにリンク先ページを読み込む設定になっている。下記のコードでは、リンク先ページを新たなタブで読み込みを行うよう設定し、ジャンプしている。

'標準モジュールの宣言セクションに記述
#If VBA7 Then   'Excel2010以上の場合
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else           'Excel2007以下の場合
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub Sample16() 'アンカー要素を取得し、2番目のリンク先にジャンプ。新しいタブで表示 Dim datWait As Date 'Date型変数(日付と時間用) Dim objIE As New InternetExplorer 'インスタンス生成 objIE.navigate "https://excel.syogyoumujou.com/memorandum/dl_file/sampleHTML.html" 'ページ読込 datWait = Now() + TimeValue("00:00:10") '10秒後の時間を格納 Do 'Do-Loop間で読込待機。 If datWait < Now() Then Exit Do '10秒以上経過したら強制終了 Call Sleep(50) '0.05秒処理を中断 Loop Until objIE.Busy = False And objIE.readyState = READYSTATE_COMPLETE objIE.Visible = True 'IEを表示 '///以下追加のコード Dim htmlDoc As HTMLDocument 'HTMLDocument型。「Microsoft HTML Object Library」の参照設定によって追加される型 Set htmlDoc = objIE.Document Call Sleep(2000) '2秒待機 objIE.Document.getElementsByTagName("a")(1).target = "_blank" '新たなタブで開く設定。現在のタブで開くは"_self" objIE.Document.getElementsByTagName("a")(1).Click 'アンカー要素をクリックしページジャンプ Set objIE = Nothing End Sub

●「Sample16」の実行結果




参考ページ

VBAでアンカー要素を取得するLinksプロパティ


ページトップへ戻る
Copyright(C) 2009- 坂江 保 All Rights Reserved.