ブラウザに表示されている複数のフレームのデータを取得するには?

解決


なー  2004-04-27 00:02:19  No: 83153  IP: [192.*.*.*]

お世話になってます。
今、VBからIEのブラウザに表示されている全てのテキストデータを取得する
処理をしています。
ブラウザの「アドレス」部分のURLは取得できるのですが、表示されている
全てのフレームのデータを取得する方法がわかりません。
例えば、左のフレームのサイトマップになっているコンテンツをクリックすると、
「アドレス」はサイトマップのままですが、右のフレームだけがコンテンツ内容の
ページに移動し、その内容をどう取得するのかということです。
inetコントロールやAPIを色々探しましたが分かりません。
どなたかご教授よろしくお願いします。。

編集 削除
魔界の仮面弁士  2004-04-27 01:37:43  No: 83154  IP: [192.*.*.*]

framesコレクションをFor Eachで列挙してみるとか。

編集 削除
なー  2004-04-27 22:13:11  No: 83155  IP: [192.*.*.*]

ありがとうございます。
アドバイスのキーワードを元に調べてみましたところ、
(ネットワークPG初心者でして。。)

    Dim objIE As InternetExplorer
    Dim objDOC   As IHTMLDocument
    Dim objFRAME As FramesCollection
    Dim plngCnt As Long
    
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Navigate "http***.html"
'    objIE.Visible = True
    
    Set objDOC = objIE.Document
    Set objFRAME = objIE.Document.frames    
    plngCnt = objFRAME.length

で詰まってしまいました。
一度、objFRAME.length  のフレーム数が取れたのですが、いじっいるうちに
エラーになってしまいました??
お手数ですが、アドバイスお願いします。

編集 削除
魔界の仮面弁士  2004-04-27 23:34:33  No: 83156  IP: [192.*.*.*]

ロード処理中にdocumentプロパティを処理しようとした場合、
エラーとなる事があります。

InternetExplorerオブジェクト(もしくはWebBrowserコントロール)の
DocumentCompleteイベントが発生するまでは、documentプロパティは
完全には読み込まれません。

DocumentCompleteイベント発生後に処理するようにしてみてください。

編集 削除
なー  2004-04-28 01:12:49  No: 83157  IP: [192.*.*.*]

お世話になります。
色々試した結果、確実にフレーム数を取れたのですが、肝心の表示データ
の取得法が分かりません。
 
    Dim objIE  As Object
    Dim objDOC   As IHTMLDocument
    Dim objFRAME As FramesCollection
    Dim pintIdx As Integer
    Dim pvar() As Variant

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Navigate "http://***.html"
'    objIE.Visible = True
        
    Do
        DoEvents
    Loop Until objIE.Busy = False

    Set objFRAME = objIE.Document.frames
     
    List1.Clear
    For pintIdx = 0 To objFRAME.length - 1
        ReDim Preserve pvar(pintIdx)
        pvar(pintIdx) = objFRAME.Item(pintIdx)
        Set objDOC = objFRAME(pintIdx).Document
        List1.AddItem objDOC    
    Next

FramesCollectionには、lengthとItemの2つのメンバがあるようですが、
Itemの使い方が分かりません。(試していてFor文の中は変な文ばかりですが)
lengthの分、インデックスがあるようですが、objDOCのオプジェクト
の中身はどう取得すればよいでしょうか?
未熟者(ソースで分かりますね・・)ですみませんが、よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-04-28 03:00:53  No: 83158  IP: [192.*.*.*]

う〜む。
先の回答で、「For Eachで」と書いたと思うのですけれども。(^^;

Forループでも出来ますが、その場合、
>  pvar(pintIdx) = objFRAME.Item(pintIdx)
ではなく、
 Set pvar(pintIdx) = objFRAME.Item(pintIdx)
と書く必要があります。
「Letステートメント」と「Setステートメント」の違いに気をつけてくださいね。

> objDOCのオプジェクトの中身はどう取得すればよいでしょうか?
えぇと。そもそも、何を取得されたいのでしょうか……?

最初の質問にあった「フレームのデータ」とか「全てのテキストデータ」が、
具体的には、どのようなデータなのかが良く分からないです。
# HTMLデータを得たいのか、XHTMLのテキストノードの値を得たいのか、
# それともHTMLのタイトルを得たいとか……。

例えば、元のHTMLを取得するなら、IPersistFileかIPersistStreamInitを
使う事になりますし、DHTML等で操作された後のHTMLを得たいなら、
objDOC.documentElement.outerHTMLが使えます。HTMLのタイトルなら、
objDOC.title で取得できますし、body要素内のテキストなら、
objDOC.body.innerText などで得られます。表要素(TABLEエレメント)が
含まれているなら、rowsコレクションとcellsコレクションを併用して、
objDOC.getElementsByTagName("TABLE")(0).rows(0).cells(0).innerText
などとして、各セルの値を取得するとか……得たいデータによって手順は様々です。

とりあえず、VB6の『ステップ実行』や『ローカル ウィンドウ』などの
機能を併用しつつ、いろいろ試して見てください。

編集 削除
なー  2004-04-28 10:40:16  No: 83159  IP: [192.*.*.*]

お世話になります。
For Eachの使い方もいまいちよく分かりませんで、お手数かけます(-_-;)
取得したいデータの内容を確認したところ、ブラウザに表示されている
全てのフレームの各URLを取得したいとのことでした。
(何かずれてますね・・すみません。)
それができるかどうかわからなくて、表示されているテキストデータを取得
しろと私に指示したようです。
内容が二転三転して申し訳ありませんが、フレーム毎の各URL取得法について
ご教授いただけないでしょうか?

編集 削除
なー  2004-04-28 11:49:52  No: 83160  IP: [192.*.*.*]

お世話になります。
objDOC.URLでフレーム毎のURLが取得できました!
本当にありがとうございました。

編集 削除
魔界の仮面弁士  2004-04-28 13:35:17  No: 83161  IP: [192.*.*.*]

> objDOC.URLでフレーム毎のURLが取得できました!
汎用的にするなら、フレームの中に、別のフレームが
入れ子になっている場合の考慮も忘れないようにして下さいね。


で。単にURLを列挙したいだけなら、これでも良いかも。

Private Sub Form_Load()
    WebBrowser1.Navigate2 "http://〜〜"
End Sub

Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
    Debug.Print URL
End Sub

編集 削除
なー  2004-04-28 17:10:16  No: 83162  IP: [192.*.*.*]

解決したと思いましたが・・・。(T_T)
フレームの中のフレームですか。。
確かに、例えば3つのフレームのあるページの一つが変わっても3つのURLは
変わりませんでした。

下記のページを参照させていただきましたが、あまり理解に至っていません。
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?mode=allread&no=3341

本当にお世話をお掛けしますが、再度ご教授いただけないでしょうか?

編集 削除