お世話になってます。
今、VBからIEのブラウザに表示されている全てのテキストデータを取得する
処理をしています。
ブラウザの「アドレス」部分のURLは取得できるのですが、表示されている
全てのフレームのデータを取得する方法がわかりません。
例えば、左のフレームのサイトマップになっているコンテンツをクリックすると、
「アドレス」はサイトマップのままですが、右のフレームだけがコンテンツ内容の
ページに移動し、その内容をどう取得するのかということです。
inetコントロールやAPIを色々探しましたが分かりません。
どなたかご教授よろしくお願いします。。
framesコレクションをFor Eachで列挙してみるとか。
編集 削除ありがとうございます。
アドバイスのキーワードを元に調べてみましたところ、
(ネットワーク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 のフレーム数が取れたのですが、いじっいるうちに
エラーになってしまいました??
お手数ですが、アドバイスお願いします。
ロード処理中にdocumentプロパティを処理しようとした場合、
エラーとなる事があります。
InternetExplorerオブジェクト(もしくはWebBrowserコントロール)の
DocumentCompleteイベントが発生するまでは、documentプロパティは
完全には読み込まれません。
DocumentCompleteイベント発生後に処理するようにしてみてください。
お世話になります。
色々試した結果、確実にフレーム数を取れたのですが、肝心の表示データ
の取得法が分かりません。
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のオプジェクト
の中身はどう取得すればよいでしょうか?
未熟者(ソースで分かりますね・・)ですみませんが、よろしくお願いします。
う〜む。
先の回答で、「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の『ステップ実行』や『ローカル ウィンドウ』などの
機能を併用しつつ、いろいろ試して見てください。
お世話になります。
For Eachの使い方もいまいちよく分かりませんで、お手数かけます(-_-;)
取得したいデータの内容を確認したところ、ブラウザに表示されている
全てのフレームの各URLを取得したいとのことでした。
(何かずれてますね・・すみません。)
それができるかどうかわからなくて、表示されているテキストデータを取得
しろと私に指示したようです。
内容が二転三転して申し訳ありませんが、フレーム毎の各URL取得法について
ご教授いただけないでしょうか?
お世話になります。
objDOC.URLでフレーム毎のURLが取得できました!
本当にありがとうございました。
> 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
解決したと思いましたが・・・。(T_T)
フレームの中のフレームですか。。
確かに、例えば3つのフレームのあるページの一つが変わっても3つのURLは
変わりませんでした。
下記のページを参照させていただきましたが、あまり理解に至っていません。
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?mode=allread&no=3341
本当にお世話をお掛けしますが、再度ご教授いただけないでしょうか?