>とあるサイトから、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
.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より