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」の参照設定によって追加され、設定できるようになる。
以下は、よく使われるもの。
HTMLDocument | Document型 |
HTMLAnchorElement | <a>要素型 |
HTMLDivElement | <div>要素型 |
HTMLParaElement | <p>要素型 |
HTMLElementCollection | HTML要素コレクション型 |
IHTMLElement | HTML要素型 |
IHTMLElementCollection | HTML要素コレクション型 |
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」の実行結果