VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1309|回复: 6

[求助] 如何遍历网页上的所有元素

[复制链接]
53_avatar_middle
在线会员 发表于 2016-5-19 20:04:47 | 显示全部楼层 |阅读模式
10驿站币
如题:如何遍历网页上的所有元素?求资料,最好有能运行的源代码。

用CHtmlView 可以吗?

还是用WebBrowser2控件呢?





上一篇:【Visual Studio 个性化设置】
下一篇:高价请人开发一款DDOS压力测试软件
53_avatar_middle
ico_lz  楼主| 发表于 2016-5-19 20:25:46 | 显示全部楼层
要能读取 <div class="logo"> 标签
51_avatar_middle
online_admins 发表于 2016-5-24 23:11:13 | 显示全部楼层
举个例子,WebBrowser 中遍历所有的 frames

http://www.cnblogs.com/dlbrant/archive/2013/06/24/3153093.html
53_avatar_middle
ico_lz  楼主| 发表于 2016-5-27 21:38:58 | 显示全部楼层
Syc 发表于 2016-5-24 23:11
举个例子,WebBrowser 中遍历所有的 frames

http://www.cnblogs.com/dlbrant/archive/2013/06/24/315309 ...

您好!感谢您的回复。
目前,网页上的所有标签已经可以读出来了。
但是我想监控该网页,看网页的内容是否发生改变。
开始我用线程来做这个事,也就是在线程里不停地读取网页内容。
但是执行一段时间之后就开始出错,程序死掉,退出。
于是我把该段代码用一个定时器来执行,就不存在这个问题了。
请问,这是什么原因?可有解决办法?在我的印象中,
定时器好像是跟界面主线程是一个线程,占用消息循环,不知道我的理解对不对?

另外,还有一个问题,就是CComPtr 和 CComQIPtr需要调用Release 吗?
53_avatar_middle
ico_lz  楼主| 发表于 2016-5-27 21:39:26 | 显示全部楼层
贴一下我的代码
53_avatar_middle
ico_lz  楼主| 发表于 2016-5-27 21:41:43 | 显示全部楼层
void CNavigateView::OutputElement(CComQIPtr<IHTMLElement> pElement)
{
        if(pElement != NULL)
        {
                CComBSTR bstr;
                if(SUCCEEDED(pElement->get_tagName(&bstr)))
                {
                        CStringA text(bstr);
                        TRACE("标签=[%s]\t",text);
                }

                if(SUCCEEDED(pElement->get_className(&bstr)))
                {
                        CStringA text(bstr);
                        TRACE("类名=[%s]\t",text);
                }

                if(SUCCEEDED(pElement->get_outerText(&bstr)))
                {
                        CStringA text(bstr);
                        text.Replace('\r',' ');
                        text.Replace('\n',' ');
                        text.Trim();
                        TRACE("内容=[%s]\t",text);
                }
               
                TRACE("\n");
        }
}


void CNavigateView::ListAllElement()
{

        CComPtr<IDispatch> spDispDoc = CHtmlView::GetHtmlDocument();
        CComQIPtr<IHTMLDocument2> pHtmlDoc2 = spDispDoc;

        //IHTMLDocument2* pHtmlDoc2 =(IHTMLDocument2*)CHtmlView::GetHtmlDocument();

        do
        {
                if(pHtmlDoc2 == NULL)
                {
                        break;
                }

                CComQIPtr<IHTMLElementCollection> pCollection;

                if(!SUCCEEDED(pHtmlDoc2->get_all(&pCollection)) || pCollection==NULL)
                {
                        break;
                }

                long labelCount = 0;

                if(!SUCCEEDED(pCollection->get_length(&labelCount)))
                {
                        break;
                }

                for(long i=0 ; i<labelCount ; i++)
                {
                        CComPtr<IDispatch> pIDisp = NULL;
                        if(!SUCCEEDED(pCollection->item(CComVariant(i),CComVariant(0),&pIDisp)) || pIDisp==NULL)
                        {
                                break;
                        }
                        CComQIPtr<IHTMLElement> pElement = pIDisp;
                        OutputElement(pElement);
                }
        }while (FALSE);
}
51_avatar_middle
online_admins 发表于 2016-5-27 23:37:45 | 显示全部楼层
xieglt 发表于 2016-5-27 21:38
您好!感谢您的回复。
目前,网页上的所有标签已经可以读出来了。
但是我想监控该网页,看网页的内容是 ...

可能是线程间同步引起的问题,主线程好用就放到主线程中吧
CComPtr 是不需要 Release 的,CComQIPtr 也一样
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-23 03:52

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表