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

    技术2026-05-03  2

    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();}

    最新回复(0)