三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

XXXXXさんへ IE操作 .getElementsByTagNameで集め .NextSiblingで次を取得してみては?

VBA IE操作で下記の質問をいただきました。



>とあるサイトから、TEL番号を取得したいのです。
>EXCELファイルのB列にURLが100件以上並んでいます。
>そのURLを開いて、TEL番号を取得し、C列に記載…という処理をURLの個数分行うマクロで苦戦しています。

>対象のソースの一部です。
<div class="clContent">
<!--infoBottom-->
<div class="infoBottomArea">
<dl class="clear">
<dt class="ico_place">あああ</dt><dd>いいいい</dd>
</dl>
<dl class="clear">
<dt class="ico_service">ううう</dt><dd>くくうく</dd>
</dl>
<dl class="clear">
<dt class="ico_tel">TEL</dt><dd>03-xxxx-xxxx</dd>
</dl>
<dl class="clear">
<dt class="ico_place">さささ</dt><dd>〒113-0039 東京都</dd>
</dl>

>取りたいのは、【03-xxxx-xxxx】です。
>以下、web上で見つけたものをいじりながら試しているのですが、
>【TEL】の後ろのTEXT(電話番号)が取れません。。。


と質問をいただきました。

DTタグのTELを探し、次の項目DDタグの中身を取得、
そんなサンプルにチャレンジしてみたいと思います。

1.指定したタグ(DT)のデータを集めてみる
2.TELのデータを判断する みつける
3.TELの次(DD)のデータを取得する
の流れで、チャレンジしてみます。

.getElementsByTagNameでDTデータを集めるテスト

1.指定したタグ(DT)のデータを集めてみる

まずは、
.getElementsByTagName

文章ドキュメント
.documentから、DTタグのデータを集めてみます。

Sub ie_test_getElementsByTagName()  'IE getElementsByTagNameをテストする。

'調査項目の入力※手抜きでInputBOX しかもキャンセル処理なし(ぉぃぉぃ)
    Dim strURL As String   '調べたい場所
    strURL = "http://ie.vba-ken3.jp/test/20130128/data001.html"
    strURL = InputBox("調べたい場所(URL)は?", "URL INPUT", strURL)
    
    Dim strTAGNAME As String  '調べるタグ
    strTAGNAME = "dt"
    strTAGNAME = InputBox("調べたHTMLタグは?", "タグ INPUT", strTAGNAME)


'IEの起動
    Dim objIE As Object '変数を定義します。
    Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。
    objIE.Visible = True      '可視、Trueで見えるようにします。
    
'処理したいページを表示します。 テストページへ移動
    objIE.Navigate strURL
    DoEvents

'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
        DoEvents  '重いので嫌いな人居るけど。
    Wend
    
'.getElementsByTagNameで指定したタグの中身を集めて表示する
    Dim objTAG As Object  'タグ処理用
    Dim n      As Integer  'n番目カウンター
    
    '.getElementsByTagNameで集める(※.getElementsByNameやIDと似てるので注意)
    Set objTAG = objIE.document.getElementsByTagName(strTAGNAME)  'タグの名前で集める
    Debug.Print strTAGNAME & "は" & objTAG.Length & "個ありました"
    If objTAG.Length = 0 Then
        MsgBox "ページに" & strTAGNAME & "タグが無かったよ あれれ"
        Exit Sub  'エラー処理しろよまったく そのままぬけるなオイ
    End If
    
    'For Eachで回せと言われそうだけど
    For n = 0 To objTAG.Length - 1
        Debug.Print objTAG(n).InnerHTML  'テストでタグの中身HTMLを表示
    Next
    
'終了処理
    Debug.Print "--終了"
    MsgBox "終了"
    objIE.Quit    'IE閉じる
    Set objIE = Nothing
    
End Sub

いつものテスト動画: http://www.youtube.com/watch?v=zzQiQFh3FUM

www.youtube.com


.NextSiblingで次の兄弟オブジェクトを代入してみた

.getElementsByTagNameでタグ(DT)のデータを集められたので、
次は、
2.TELのデータを判断する みつける
If objElement.innerTEXT = "TEL"
.InnerTEXTで値を探して、

3.TELの次(DD)のデータを取得する
Set objDD = objElement.NextSibling '次の兄弟エレメントDDを入れる
.NextSiblingで次のオブジェクトを代入してみました。

そんなテストプログラムです。

'NextSiblingを使い、DTの次のDDを取得してみたそんなテスト
Sub ie_test_NextSibling()  'IE NextSiblingをテストする。

'調査URL
    Dim strURL As String   '調べたい場所
    strURL = "http://ie.vba-ken3.jp/test/20130128/data001.html"
    
'IEの起動
    Dim objIE As Object '変数を定義します。
    Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。
    objIE.Visible = True      '可視、Trueで見えるようにします。
    
'処理したいページを表示します。 テストページへ移動
    objIE.Navigate strURL
    DoEvents

'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
        DoEvents  '重いので嫌いな人居るけど。
    Wend
    
'.getElementsByTagNameで指定したタグの中身を集めて判断する
    Dim objElement As Object  'タグを1つ1つ取り出し処理する
    Dim objDD      As Object  '結果を入れる(次のタグ DDオブジェクト)
    
    '.getElementsByTagNameで集める(※.getElementsByNameやIDと似てるので注意)
    Set objDD = Nothing  '結果を初期化する。
    'タグの名前DTで集め 1つ1つ取り出して処理を行う
    For Each objElement In objIE.document.getElementsByTagName("dt")
        Debug.Print objElement.innerHTML  'テストで中身HTMLを表示
        If objElement.innerTEXT = "TEL" Then  'テキストが一致するか判断する 探す
            Debug.Print "みつけた"
            Set objDD = objElement.NextSibling  '次の兄弟エレメントDDを入れる
            Exit For    'みつけたのでループを途中で抜ける
        End If
    Next
   
    'TELみつけたか(代入済みか)
    If objDD Is Nothing Then
        MsgBox "TELが見つかりません"
        Exit Sub
    End If
    
    '見つかった時の処理
    Debug.Print objDD.innerHTML
    Debug.Print objDD.innerTEXT
    
'終了処理
    Debug.Print "--終了"
    MsgBox "みつけたTELは " & objDD.innerTEXT & " です"
    objIE.Quit    'IE閉じる
    Set objIE = Nothing
    
End Sub

いつものテストと解説動画: http://www.youtube.com/watch?v=EpXGe7Q77bo
www.youtube.com


おわりの挨拶

.NextSiblingで 次の(Next) 兄弟(Sibling) かぁ...
データの探し方、取得時の指定方法など
使えそうなので .NextSibling 使ってみてください。

以上、
プログラミング言語よりも先に日本語勉強しろと言われている
脳内垂れ流し解説でした(ぉぃぉぃ)

何かの参考となれば、幸いです。 永遠の三流プログラマー Ken3より

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)