【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する

★気に入ったらシェアをお願いします!


リンク

みなさん、こんにちは!
VBAってわりとカッチリしているプログラム言語だなと感じているタカハシ(@ntakahashi0505)です。

初心者向けエクセルVBAでIEを操作するシリーズの第4回目です。

前回はこちらの記事で

【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
エクセルVBAでIEを操作するシリーズの第3回、今回はIEの読み込み待ちの処理を入れていきます。この処理はVBAでIEを扱う限りはほとんどの場合で必要となる処理ですので、ぜひ覚えて頂ければと思います。

エラーを発生させずにHTMLドキュメントを取得するためにブラウザの読み込み待ち処理を入れる方法をお伝えしました。

今回からいよいよ開いたページに対して色々な操作をしていきたいと思います。

まず手始めに、Linksという命令とFor Each~Nextという繰り返し処理を用いてページ内のリンク先URLを全て取得する方法についてお伝えします。

では、よろしくお願いします!

前回のおさらい

前回のプログラムはこちらでした。

JR東日本のトップページからHTMLドキュメントを取得して、そのページタイトルを表示するという内容です。

ブラウザの読み込みが完了する前にHTMLドキュメントを取得しようとするとエラーになってしまうので、Do While~Loopで読み込み待ちの処理を入れております。

ページタイトルは単純にhtmlDoc.Titleで取得することができましたが、今回はこのページ内のリンク先URLをゴソっと取得していきたいと思います。

HTMLのアンカータグの仕組み

まずVBAでリンク先URLを取得するに先立って、リンク先URLがHTMLではどのように表現されているかを知っておく必要があります。

サイト上での表現は

いつも隣にITのお仕事

こんな感じですね。これが実際にHTMLではどのように記述されているかと言いますと

こんな風になっています。

リンクについては「<a>~</a>」と記述されるタグを使いまして、アンカータグと言います。通称aタグですね。

「href=”~”」の部分はhref属性と言いまして、実際のリンク先のURLをこのダブルクォーテーションで囲っています。

ですから、このhref属性の値を取得するというのが今回のお題の最終目的となります。

Linksでa要素をコレクションとして取得

ページタイトルは1つのページ(つまりHTMLドキュメント)に対して1つしかありませんので、htmlDoc.Titleとすれば簡単に取得することができました。

しかし、リンク先URLは1つのページに1つしかないということはほとんどありません。JR東日本さんのトップページもたくさんのリンクがあります。

ですがエクセルVBAではオブジェクトをゴソっと集合として取り扱うことができる「コレクション」という概念があります。

任意のページのa要素をコレクションとして取得する場合は

HTMLドキュメント.Links

と書きます。

便利ですね~。

コレクションに含まれる全てのa要素からhref属性の値を取り出す

Linksによってa要素のコレクションを取得できたら、次はそのコレクションに含まれる全てのa要素からhref属性の値を取り出す作業をします。

コレクションに含まれる全ての要素について何かをしたい場合はFor Each~Nextを使えばOKです。

まず繰り返しの際に都度要素を格納するオブジェクト変数を

Dim オブジェクト変数 as IHTMLelement

として用意します。HTMLの何らかのエレメントを入れる場合はIHTMLelementというオブジェクトになります。なぜか頭文字として’I’がついているので注意してください。

繰り返し文は

For Each オブジェクト変数 In コレクション

(処理)

Next オブジェクト変数

と書きますね。

今回の場合はa要素のコレクションはhtmlDoc.Linksで取得できますから

となります。

さらに、a要素からhref属性の値を取得する場合は

オブジェクト変数.href

とすることで取得できます。

HTMLドキュメントが全部を含んでいて大きな器になっていて、その中に色々なものが入れ子構造で含まれていますので、欲しいものを次々に取得していくというのが、WEBスクレイピングの基本の進め方になります。

マトリョーシカみたいな感じです。なんとなくノリは理解できますかね?

今回はhrefをDebug.Printでイミディエイトウィンドウに出力したいと思います。

では以上を踏まえてプログラム全文です。

実行をしますと

ページ内の全てのリンク先URLを取得

無事に全てのリンク先URLを出力することができました。

まとめ

HTMLドキュメントからそのページのa要素を全て取得して、そのリンク先URLつまりhref属性の値を出力することができました。

またFor Each~Nextでコレクション内の要素全てについて繰り返す記述方法も理解していただけたと思います。

HTMLドキュメントを取り扱う場合は、コレクションはかなり使いますので、使い方に慣れていっていただければと思います。

次回はHTMLドキュメントからmetaタグのディスクリプションを取得する方法をお伝えしています。

【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
初心者向けエクセルVBAでIEを操作するシリーズ第5回目です。getElementsByNameでディスクリプションなどの要素をname属性を条件として取得する方法についてお伝えします。

SEO好きにはたまりませんね…!

連載目次:エクセル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操作】IEで検索窓にキーワードを入力して送信する方法
  9. 【エクセルVBAでIE操作】ページをクロールしてブログの記事一覧を取得する方法
  10. 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
  11. 【エクセルVBAでIE操作】ページャーを最後のページまでどんどんリンクする
  12. 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする

連載目次:データ一覧から請求書を自動で作る

お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。
  1. 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
  2. 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
  3. 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
  4. 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
  5. 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
  6. 【初心者向けエクセルVBA】Public変数の宣言とSubプロシージャの呼び出し
  7. 【初心者向けエクセルVBA】InputBoxでの日付入力と月末日の自動算出
  8. 【初心者向けエクセルVBA】Worksheetのコピーを活用して複数の請求書を作る
  9. 【初心者向けエクセルVBA】ファイルのコピーを使って取引先別の請求書を作る
  10. エクセルVBAでDateAdd関数を使って年月を条件としてSumIfs関数を使う方法
  11. 宣言もセットも不要!エクセルVBAでワークシートをオブジェクト名で取り扱う方法
  12. エクセルVBAでシートの列の挿入も簡単に対応できちゃう列挙体の使い方

The following two tabs change content below.
1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、コンサル、執筆本を中心に活動しています。→詳しいプロフィールはコチラ ★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ ★フォロー頂ければ嬉しいです。

コメント

  1. taka より:

    楽しく読ませていただいております。
    LINKSでURLが全部出てくることがわかりました。
    特定のリンクアドレスのみ出力するにはどうしたら良いでしょうか?

    例えば
    abc.com/123/1.html
    abc.com/123/2.html
    abc.com/123/・・・・.html
    abc.com/123/10000.html
    のようなabc.com/123/にリンクするアドレスのみ取り出したい場合などはどうしたら良いでしょうか?

    • takaさん

      コメントありがとうございます。
      「abc.com/123/」を含むという条件式で取り出せば良いということですよね。Like演算子を使ったIf文で

      とすればよいかと思います。