【发布时间】:2011-03-17 23:46:26
【问题描述】:
我编写了一个浏览器帮助对象来获取标签之间的文本并将其用于数据挖掘目的。我尝试在igoogle 上使用它(基本上是为了测试它在小工具上的功能),但在某些外部源存在<iframe> 的情况下它失败了。
我可以得到<div> 及其子<iframe>,但无法得到身体。
我从这个 API HRESULT IHTMLDocument2::get_frames(IHTMLFramesCollection2 **p);得到帧集合
可以使用loan calculator 小工具在 igoogle 和 firefox 中重新创建该问题。您还需要 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&exp_track_js=1&v=682f3db70d7cfff515d7c64fd24923&container=ig&view=default&debug=0&mid=8&lang=en&url=http%3A%2F%2Fwww.nova.edu%2F%7Ewillheat%2Floan.xml&country=US&parent=http://www.google.com&libs=core:core.io:core.iglegacy:auth-refresh&synd=ig&view=default#st=...B27zWVKsnJu6OviCNnzXoPjkDsbPg95yZNMwfmMaLnwWoRxGaRArxTpOqK4TiH87uGUiHnYkkaqU9NE1sOyms6sg/Jwi&gadgetId=116809661812082345195&gadgetOwner=105250506097979753968&gadgetViewer=105250506097979753968&rpctoken=422312139&ifpctok=422312139">
</iframe>
</div>
链接不完整,因为我已将src 的某些部分替换为...。现在您可以看到,虽然它在浏览器中呈现,但没有主体。
根据这篇文章 (http://stackoverflow.com/questions/957133/does-body-onload-wait-for-iframes),body 上的 onload 事件不会等待帧完成。
所以我可以得出结论,我必须为<iframe> 使用某种onload 侦听器...但我不确定如何...
请建议一种方法/sn-p 使用 ATL/COM API 检索 <iframe> 的正文...
** 更新**
我正在使用以下代码获取<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"));
}
}
}
}
}
}
}
}
还有,
void box(LPCWSTR msg)
{
MessageBox(NULL,msg,_T("..BOX.."),MB_OK);
}
任何建议,如何获取 iframe 正文 .... 顺便说一下,我在 OnDocumentComplete 事件中处理这个...
谢谢,
【问题讨论】:
-
对不起 - 你的问题到底是什么?
-
嗨 Changeling,我正在尝试获取