vc采集网页内frame框架下所有元素(不指定具体table/form) .

1.独立代码

//-----------开始---------------------//
#include <atlbase.h>
#include <mshtml.h>
#include <winuser.h>
#include <comdef.h>
#include <string.h>
void EnumIE(void);//处理网页
CComModule _Module;  //使用CComDispatchDriver ATL的智能指针,此处必须声明
#include <atlcom.h>
void EnumAllElement(IHTMLDocument2 * pIHTMLDocument2);

void EnumIE(void)  
{  
  CComPtr<IShellWindows> spShellWin;  
  HRESULT hr=spShellWin.CoCreateInstance(CLSID_ShellWindows);  
  if (FAILED(hr))  
  {  
  return;  
  }      

  long nCount=0;    //取得浏览器实例个数(Explorer和IExplorer)  
  spShellWin->get_Count(&nCount);  
  if (0==nCount)  
  {  
    return;  
  }

  for(int i=0; i<nCount; i++)  
  {  
    CComPtr<IDispatch> spDispIE;  
    hr=spShellWin->Item(CComVariant((long)i), &spDispIE);  
    if (FAILED(hr)) continue;
 
    CComQIPtr<IWebBrowser2>spBrowser=spDispIE;  
    if (!spBrowser) continue;
 
    CComPtr<IDispatch> spDispDoc;  
    hr=spBrowser->get_Document(&spDispDoc);  
    if (FAILED(hr)) continue;
 
    CComQIPtr<IHTMLDocument2>spDocument2 =spDispDoc;  
    if (!spDocument2) continue;      

 //Modify by jncao 2007-09-17
 //*******************************************************************************
 CString cIEUrl_Filter;  //设置的URL(必须是此URL的网站才有效);
    cIEUrl_Filter="http://127.0.0.1:8082/csp/"; //设置过滤的网址
    //*******************************************************************************

    CComBSTR IEUrl;
 spBrowser->get_LocationURL(&IEUrl);
 CString cIEUrl_Get;     //从机器上取得的HTTP的完整的URL;
 cIEUrl_Get=IEUrl;
 cIEUrl_Get=cIEUrl_Get.Left(cIEUrl_Filter.GetLength()); //截取前面N位

 if (strcmp(cIEUrl_Get,cIEUrl_Filter)==0)
 {
     // 程序运行到此,已经找到了IHTMLDocument2的接口指针      
       EnumAllElement(spDocument2);//枚举所有元素

 }   
  }  
}

 

void EnumFrame(IHTMLDocument2 * pIHTMLDocument2)
{  
 if (!pIHTMLDocument2) return;      
 HRESULT   hr;  
   
 CComPtr<IHTMLFramesCollection2> spFramesCollection2;  
 pIHTMLDocument2->get_frames(&spFramesCollection2); //取得框架frame的集合  
   
 long nFrameCount=0;        //取得子框架个数  
 hr=spFramesCollection2->get_length(&nFrameCount);  
 if (FAILED(hr)|| 0==nFrameCount) return;  
   
 for(long i=0; i<nFrameCount; i++)  
 {  
  CComVariant vDispWin2; //取得子框架的自动化接口  
  hr = spFramesCollection2->item(&CComVariant(i), &vDispWin2);  
  if (FAILED(hr)) continue;      
  CComQIPtr<IHTMLWindow2>spWin2 = vDispWin2.pdispVal;  
  if (!spWin2) continue; //取得子框架的   IHTMLWindow2   接口      
  CComPtr <IHTMLDocument2> spDoc2;  
  spWin2->get_document(&spDoc2); //取得子框架的   IHTMLDocument2   接口
  
  EnumAllElement(spDoc2);      //递归枚举当前子框架   IHTMLDocument2   上的所有控件
 }  
}

 

 

void EnumAllElement(IHTMLDocument2 * pIHTMLDocument2) //枚举所有字段
{
 if (!pIHTMLDocument2) return; 
 EnumFrame(pIHTMLDocument2);   //递归枚举当前IHTMLDocument2上的子框架frame  
 HRESULT   hr;  

 CComQIPtr<IHTMLElementCollection> spAllElement;
 hr=pIHTMLDocument2->get_all(&spAllElement);//获取所有网页内所有元素
 if (FAILED(hr))  return;  

 long nLength = 0;
 spAllElement->get_length (&nLength);
 for (int i = 0; i < nLength; i++)
 {
        CComPtr<IDispatch> pDisp;
  hr = spAllElement->item(COleVariant((long)i),COleVariant((long)0),&pDisp); //获取单个元素
  if(SUCCEEDED(hr))
  {
   //CComQIPtr <IHTMLElement, &IID_IHTMLElement> pElement(pDisp);
   CComQIPtr<IHTMLElement, &IID_IHTMLElement> pElement;
   pDisp->QueryInterface(&pElement);
   BSTR bTemp;
   pElement->get_id(&bTemp);//可以获取其他特征,根据具体元素而定
   CString strTemp=bTemp;
   if(!strTemp.IsEmpty() && strTemp=="callNo")//根据callNo(效能提升text控件id)是主叫号码获取值或作其他处理
   {
    IHTMLInputTextElement* input;
    pDisp->QueryInterface(IID_IHTMLInputTextElement,(void**)&input);
    input->get_value(&bTemp);
    if(bTemp==NULL) strTemp="null";
    else strTemp=bTemp;
    CStdioFile ioFile;
    ioFile.Open("callerno.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate);
    ioFile.SeekToEnd();//先定位到文件尾部
    CString strInsert=strTemp+"/n";
    ioFile.WriteString(strInsert);
    ioFile.Close();
   }
  }
 }
}

//-----------结束---------------------//

2.执行代码:

void CDemoDlg::OnOK()
{
 // TODO: Add extra validation here
 ::CoInitialize(NULL); //初始化COM
     EnumIE();             //枚举浏览器      
     ::CoUninitialize();   //释放COM
 //CDialog::OnOK();
}

 

from:http://blog.csdn.net/fjssharpsword/article/details/6193564

 

时间: 2024-10-28 15:11:46

vc采集网页内frame框架下所有元素(不指定具体table/form) .的相关文章

网页-HTML外部链接如何用URL打开内联框架(急用!在线等)

问题描述 HTML外部链接如何用URL打开内联框架(急用!在线等) 一个网站,里面使用内联框架对子页面进行调度. 无论子页面如何变化,框架依旧是不变的(域名也不会变化),这导致我获取子页面的地址变得十分困难. 如果直接使用内联框架子页面的地址,将导致父框架消失. 如何在一个外部网页中输入一个特殊的URL定位到父框架内的指定子框架呢? 打个比方:我有一个A网站,里面使用了内联框架链接到了B网页 我在C网站发布了一个链接(目的是指向B网页),如何使B网页的父框架(也就是A网站的框架)不消失呢? 求高

C# winform webbrowser 怎么获取网页内框架的链接地址

问题描述 C#winformwebbrowser怎么获取网页内框架的链接地址webBrowser1.Document.Window.Frames.Count可以得到网页的框架数量webBrowser1.Document.Window.Frames[0].Document.Url.ToString();出现以下错误:"System.UnauthorizedAccessException"类型的未经处理的异常在System.Windows.Forms.dll中发生其他信息:拒绝访问.(异常

怎么获取网页内框架的链接地址

问题描述 怎么获取网页内框架的链接地址webBrowser1.Document.Window.Frames.Count可以得到网页的框架数量webBrowser1.Document.Window.Frames[0].Document.Url.ToString();出现以下错误:"System.UnauthorizedAccessException"类型的未经处理的异常在System.Windows.Forms.dll中发生其他信息:拒绝访问.(异常来自HRESULT:0x8007000

js-如何获取网页内封装的数据

问题描述 如何获取网页内封装的数据 应该如何获取这样一个网页,其中表格里面的那些数据呢? 我希望可以获取这些数据,然后通过处理将它显示在程序中,但是我查看了网页的源码,这些数据并没有直接出现,是封装在什么地方吗? 我应该怎样获取这些数据呢? 网页源码如图,表格中的数据是封装在哪里?又应该通过什么方式获取呢? 解决方案 可能是框架网页,或者ajax异步加载的,用fiddler看下,照着写. 解决方案二: 用javascript动态生成的,用webbrowser等可以获取到页面内容. 解决方案三:

如何实现frameset框架下的选项卡?

问题描述 如何实现frameset框架下的选项卡? 如何实现frameset框架下的选项卡?左侧是导航栏,右侧是内容,在右侧实现选项卡效果. 解决方案 假设要实现的网页是menu.html,导航页是left.html,内容是right.html: 1.创建三个网页:left.html(导航栏);right.html;(内容)menu.html(测试页) 2.把left和right两个页面做好 3.然后在menu页面的标签内添加frameset标签:

防止网页被嵌入框架的代码(续)

两年前,我写过一段代码,防止网页被嵌入框架(Frame). <script type="text/javascript"> if (window!=top) // 判断当前的window对象是否是top对象 top.location.href = window.location.href; // 如果不是,将top对象的网址自动导向被嵌入网页的网址 </script> 这段代码是有效的.但是,有一个问题:使用后,任何人都无法再把你的网页嵌入框架了,包括你自己在内

环境-vc++6.0内关于s=(i++)*(i++)的问题

问题描述 vc++6.0内关于s=(i++)*(i++)的问题 int i = 0: s = (i++)*(i++) printf("%d",s): 这个结果应该是多少?我个人分析应该是2,第一个i++使用的是1 然后i的值应该变成2然后第二个i使用的是2 然后i变成3 结果s的值应该是2 但是在vc++6.0的环境下运行结果为什么是1呢?新手求解. 解决方案 这个问题问了无数遍,我想这么告诉你. 就C++语言来说,这个是语言未定义行为,所谓语言未定义行为,就是在语言规范中没有规定遇到

html-iframe内链框架的运用

问题描述 iframe内链框架的运用 在学习html中的框架iframe.遇到一题是运用iframe内链框架做出来如下图的效果.请指教 解决方案 iframe框架运用 解决方案二: 直接在body里面嵌套一个Iframe 解决方案三: 给连接添加target属性,属性值为iframe的name属性值,就可以将连接地址在指定框架内打开. 解决方案四: 我给你说一下思路,在页面内设置至少两个div ,第一个div 中嵌套iframe标签,显示google 搜索部分,下半部分的viv 也嵌套一个ifr

在Python的Flask框架下收发电子邮件的教程

  这篇文章主要介绍了在Python的Flask框架下收发电子邮件的教程,主要用到了Flask中的Flask-mail工具,需要的朋友可以参考下 简述 在大多数此类教程中都会不遗余力的介绍如何使用数据库.今天我们对数据库暂且不表,而是来关注另一个在web应用中很重要的特性:如何推送邮件给用户. 在某个轻量级应用中我们可能会添加一个如下的邮件服务功能:当用户有了新的粉丝后,我们发送一封邮件通知用户.有很多方法可以实现这个特性,而我们希望提供出一种可复用的通用框架来处理. Flask-Mail介绍