关于取得网页里面所有超链接的问题

meCAD 2006-08-11 11:25:56
我要做的是一个搜索Email,电话号码,手机号码,名称等信息的程序.

头一步要做的就是从第一张网页里面分析出所有的超链接,然后一一根据这些链接爬行下去.

现在问题的问题是:
办法1.是使用idhttp来下载一个页面,使用正则表达式来查找出href.
办法2.用下面这段代码来获得.
int hrefn = 0;
ListBox1->Clear();
RichEdit1->Clear();
if( CppWebBrowser1->ReadyState!=4)
{
ShowMessage("not Completed");
return ;
}
IHTMLDocument2* pDocument;
IHTMLElementCollection* p;
IHTMLElement* link ;
long len ;
HRESULT hr ;
//获得IHTMLDocument2接口
hr = CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2,(void**)&pDocument);
if( !SUCCEEDED(hr) )
{
ShowMessage("hehe") ;
return ;
}
//得到Document中所有的Element
pDocument->get_all(&p);
pDocument->Release() ;
p->get_length(&len) ;
for(int i=0;i<len;i++)
{
IDispatch* pDisp ;
Variant j ;
//得到Collection中的第i个Element
p->item((Variant)i,j,&pDisp) ;
hr= pDisp->QueryInterface(IID_IHTMLElement,(void**)&link) ;
if( !SUCCEEDED(hr) )
return ;
pDisp->Release() ;
wchar_t* name ;
//提取tag属性
link->get_tagName(&name);
RichEdit1->Lines->Add((AnsiString)name);
if( wcscmp(name,L"A")==0 )
{
VARIANT v ;
//提取href属性
link->getAttribute(L"HREF",0,&v) ;
wchar_t* va = v.bstrVal ;
AnsiString str = (AnsiString)va ;
ListBox1->Items->Add(str);
hrefn = hrefn + 1;
}
link->Release() ;
}
ListBox1->Items->Add("共有"+IntToStr(hrefn)+"条超链接");


这段代码能获得超链接,只是我对这段代码是一知半解
现在有以下几个个问题
...全文
363 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
类库 2006-08-12
  • 打赏
  • 举报
回复
Email用正则表达式容易描述,但电话号码这些就难了,特有信息太少
还是用IHTMLDocument2接口,几乎不会出错
ccrun.com 2006-08-12
  • 打赏
  • 举报
回复
推荐用“直接获取HTTP数据,并用IHTMLDocument2接口分析”的方法来做。

不需要正则表达式,因为IHTMLDocument接口的功能很强大,取链接列表很easy。因为直接是获取http数据,不需要下载相应的图片或js等文件,所以速度要比CppWebBrowser获取快。

我大概的看了楼主的代码中
if(wcscmp(name,L"A")==0)
用这个语句来判断是否为超链接,这个算法不太合适。

首先,利用IHTMLDocument2的get_links方法得到所有链接的接口(IHTMLElementCollection)。
然后,得用MSHTML提供的IHTMLAnchorElement,依次遍历IHTMLElementCollection中的item,通过IHTMLAnchorElement的get_href方法得到链接的地址。

抽时间仔细研究一下mshtml.h,你会有很多收获。
meCAD 2006-08-12
  • 打赏
  • 举报
回复
第二种办法会不会导致速度变慢?

我觉得第一种办法的速度是最快的
muroachanf 2006-08-12
  • 打赏
  • 举报
回复
第一种办法没有浏览器限制,不过正则表达式好难写的,如果你不怕的话就用吧
第二种比较简单,不过受限制于ie,不过用起来比较简单,自己看msdn吧,挨着解释好累的。
meCAD 2006-08-12
  • 打赏
  • 举报
回复
顶下
meCAD 2006-08-11
  • 打赏
  • 举报
回复
问题1.以上两种办法哪种好,包括速度方面
问题2.第二种办法的代码谁能解释下给我听听吗?

我知道第二种办法是使用了CppWebBrowser,如果遇到一些需要登陆的网页,那么直接用ie登陆后即可

而idhttp之类的还要post用户名及密码.

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧