您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:84 来源:vckbase.com

本文章共1938字,分2页,当前第1页,快速翻页:
 

如何提取网页中所有链接
作者:谭昕

下载本文示例源代码

逆风编程精品
见过“网际快车”的“使用网际快车下载全部链接”这个功能吗?想实现它,我们可以这样做:
IE有几个有用的接口,我们可以用它来提取网页所有链接。

一、基本原理

首先是用IHTMLDocument2的get_links,来获取IHTMLElementCollection接口,再通过IHTMLElementCollection来获取IHTMLAnchorElement,而IHTMLAnchorElement接口的get_href就是我们想要的,通过循环获取,我们就可以得到网页的所有链接了!

二、具体代码


{

    TCHAR HostName[2*MAX_PATH];

    CComPtr<IDispatch> spDispatch;

    CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pDoc2;

    CComPtr<IHTMLElementCollection> pElementCol;

    CComPtr<IHTMLAnchorElement> pLoct;

    // TODO: Add your control notification handler code here

    int n = m_LinksList.GetItemCount();//GetCount();



    for (int i = 0; i < n; i   ){

        IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_LinksList.GetItemData(i);

        if (pBrowser){

            pBrowser->Release();

        }

    }



    m_LinksList.DeleteAllItems();

    m_LinksNum = 0;

    Log("**************************************************************");

    Log("\r\n");



    if (m_spSHWinds){

        int n = m_spSHWinds->GetCount();

        for (int i = 0; i < n; i  ){

            _variant_t v = (long)i;

            IDispatchPtr spDisp = m_spSHWinds->Item(v);





            SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);   //生成一个IE窗口的智能指针

            if (spBrowser){



                if (SUCCEEDED(spBrowser->get_Document( &spDispatch)))

                    pDoc2 = spDispatch;

                if(pDoc2!=NULL)

                {

                    if (SUCCEEDED(pDoc2->get_links(&pElementCol)))

                    {

                        //    AfxMessageBox("IHTMLElementCollection");

                        long p=0;

                        if(SUCCEEDED(pElementCol->get_length(&p)))

                            if(p!=0)

                            {   

                                m_LinksNum = m_LinksNum p;

                                UpdateData(FALSE);



                                for(long i=0;i<=(p-1);i  )

                                {



                                    BSTR String;

                                    _variant_t index = i;

                                    if(SUCCEEDED(pElementCol->item( index, index, &spDispatch)))

                                    if(SUCCEEDED(spDispatch->QueryInterface( IID_IHTMLAnchorElement,(void **) &pLoct)))



                                    pLoct->get_href(&String);

                                    ZeroMemory(HostName,2*MAX_PATH);

                                    lstrcpy(HostName,_bstr_t(String)); 

                                    m_LinksList.InsertItem(i,HostName);

                                    m_LinksList.SetCheck(i,TRUE);

                                   

                                    pLoct->get_hostname(&String);

                                    ZeroMemory(HostName,2*MAX_PATH);

                                    lstrcpy(HostName,_bstr_t(String)); 

                                    if(lstrlen(HostName))

                                    {

                                        m_LinksList.SetItemText(i,1,HostName);

                                        Log(HostName );

                                        Log("\r\n");

                                    }

                                    

                                }

                            }

                    }



                }



            }

        }

    }

} 
 
本文章更多内容1 - 2 - 下一页>>
相关文章

用C#语言实现http协议下的多线程文件传输
如何选中其他程序ListView控件中的某个Item
在VC中调用 WebService (非托管)
自动查找并删除VC生成的临时文件
一步步制作真彩工具条
如何定制浮动工具条
一个完善的ODBC数据库程序
一个简单的时钟程序
利用OpenGL实现动画效果
实现类似Excel和Visual C 里文件夹式样的标
DCT快速变换
think window procedure
关于CEdit控件的透明 --作者:monsoon
创建分层窗口,实现图像渐变
关于调试时输出的字符串信息
SendMessage和PostMessage,total ordering
用udp协议通讯示例
用VC 制作QQ自动登陆软件
MFC程序员的WTL指南: Part II - WTL 界面基
COM 组件设计与应用(十)——IDispatch 接

相关评论


本文章所属分类:首页 VC++

  热门关键字: