2010-07-19 69 views
0

我已經編寫了一個瀏覽器助手對象來獲取標籤之間的文本並將其用於數據挖掘目的。我嘗試在igoogle上使用它(基本上是爲了測試它在小工具上的功能),並且在某些與某些外部源一起存在的情況下失敗。如何使用C++/ATL/COM訪問<iframe> body?

我可以得到<div>及其子代,但未能得到正文。

我從這個API HRESULT IHTMLDocument2::get_frames(IHTMLFramesCollection2 **p);

這個問題可以在iGoogle和Firefox中使用的小工具loan calculator重新創建得到了框架集。您還需要使用fire bug擴展來調試頁面。爲了便於參考我在這裏粘貼樣品...

<div class="modboxin" id="m_8_b"><div style="border: 0pt none; padding: 0pt; margin: 0pt; width: 100%;" id="remote_8"> 
<iframe scrolling="no" frameborder="0" onload="_ifr_ol(this)" style="border: 0pt none; padding: 0pt; margin: 0pt; width: 100%; height: 100px; overflow: hidden;" name="remote_iframe_8" id="remote_iframe_8" src="http://8.ig.gmodules.com/gadgets/ifr?exp_rpc_js=1&amp;exp_track_js=1&amp;v=682f3db70d7cfff515d7c64fd24923&amp;container=ig&amp;view=default&amp;debug=0&amp;mid=8&amp;lang=en&amp;url=http%3A%2F%2Fwww.nova.edu%2F%7Ewillheat%2Floan.xml&amp;country=US&amp;parent=http://www.google.com&amp;libs=core:core.io:core.iglegacy:auth-refresh&amp;synd=ig&amp;view=default#st=...B27zWVKsnJu6OviCNnzXoPjkDsbPg95yZNMwfmMaLnwWoRxGaRArxTpOqK4TiH87uGUiHnYkkaqU9NE1sOyms6sg/Jwi&amp;gadgetId=116809661812082345195&amp;gadgetOwner=105250506097979753968&amp;gadgetViewer=105250506097979753968&amp;rpctoken=422312139&amp;ifpctok=422312139"> 
</iframe> 
</div> 

的聯繫,因爲我已經取代了src...的某些部分是不完整的。現在,你可以看到,儘管它在瀏覽器中呈現,但它沒有正文。

根據此文章(http://stackoverflow.com/questions/957133/does-body-onload-wait-for-iframes),正文上的onload事件不會等待幀完成。

因此我可以斷定,我必須使用某種onload偵聽器 ......但我不知道怎麼...

請提出一個方法/段使用檢索的身體ATL/COM API的...

** **更新

我使用下面的代碼來獲取<iframes>。雖然我得到的iframe集合,但當我試圖讓他們的身體失敗...可能是因爲他們沒有加載的那段時間?!

void testFrame(IHTMLDocument2* pDocument) 
{ 
    CComQIPtr<IHTMLFramesCollection2> col; 
    HRESULT hr = pDocument->get_frames(&col); 
    if((hr == S_OK) && (col != NULL)) 
    { 
     long counter = 0; 
     hr = col->get_length(&counter); 
     if((hr == S_OK) && (counter > 0)) 
     { 
      for (int i = 0; i < counter; i++) 
      { 
       VARIANT  v1, v2; 
       v1.vt = VT_I4; v1.lVal = i; 
       VariantClear (&v2); 
       hr = col->item(&v1, &v2); 

       if (hr == S_OK && (v2.vt == VT_DISPATCH)) 
       { 
        CComPtr<IDispatch> pDispatch = v2.pdispVal; 
        CComQIPtr<IHTMLWindow2, &IID_IHTMLWindow2> pFrame = pDispatch; 

        if(pFrame) 
        { 
         CComPtr<IHTMLDocument2> spHTML; 
         hr = pFrame->get_document (&spHTML); 

         if((hr == S_OK) && (spHTML != NULL)) 
         { 
          CComQIPtr<IHTMLElement> elem; 
          hr = spHTML->get_body(&elem); 
          if((hr == S_OK) && (elem != NULL)) 
          { 
           CComBSTR str; 
           hr = elem->get_innerHTML(&str); 
           if((hr == S_OK) && (str != NULL)) 
           { 
            box(str); 
           }else if(hr != S_OK) { 
            box(_T("hr is not ok")); 
           }else if(str == NULL){ 
            box(_T("STR is null")); 
           }else 
            box(_T("Failed")); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

而且,

任何建議,如何通過我在OnDocumentComplete事件處理這種方式獲得的iframe身體.... ...

謝謝,

+0

對不起 - 你的問題是什麼呢? – 2010-07-19 15:45:40

+0

嗨Changeling,我想獲得