关于解析网页的问题 我想问一下各位大大,到底是用IE的COM接口解析好, 还是自己通过http拿到网页源码用正则表达式解析好,两者各有何利弊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 会不会IE的COM解析的比较全面,自己解析有些会漏掉?还有如果一个网页已经在浏览器里被打开,用IE的COM解析会比较快,如果自己解析的话是不是还要读IE的缓存啊? 如果一个网页已经在本进程创建的浏览器控件里被打开,从浏览器控件的文档解析会比较快。自己解析HTML可以,但是DHTML你怎么解析?自己写Javascript、VBScript和JScript引擎? 我的目的仅仅是提取网页里的链接的话,是不是不用浏览器控件的文档解析就不能得到DHTML里面的网页链接,是吗? 如果只是提取 连接 那就不要这么麻烦啊 你得到html文件后 用正则表达式搜索里面的字符串 我想起来了 vckbase里面有个文章讲到了这个 我来找找 《如何提取网页中所有链接》http://www.vckbase.com/document/viewdoc/?id=646===========================见过“网际快车”的“使用网际快车下载全部链接”这个功能吗?想实现它,我们可以这样做: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"); } } } } } } } }}本程序在VC7+WINXP下编译通过,详细请看源代码! 有一种情况,如果网页已经打开浏览器里打开,我还要再建立一个Http连接取Html文件,是不是有点傻,有没有比较智能的方法,就是如果一个网页在浏览器里被打开,我就从IE的Com接口里取,如果没打开,我就自己建立Http链接取回Html文件再用正则表达式搜索?还有用正则表达式搜索里面的字符串对于Javascript、VBScript和JScript里的链接是不是一样可以拿的到呢?这里面的链接不一定是Href开头的啊? ShowBalloonTip函数的使用 定义个临界区对象后,代码是按什么顺序执行的 求救,命名已经包含头文件了,但是为什么还是找不到函数声明? 关于发送char和CString的问题 MD5源程序不知杂用 多线程的应用范围是什么?设计要点是什么? 请问在MSMQ应用中服务器一定要域控制器吗?在客户端能否使用IP地址配置PATH? 请教!MFC中接口的注册问题 求教,vc中oracle的写入语句 CDateTimeCtrl::SetTime()的问题 关于一个函数类型转换的问题 请问如何在windows和linux下看当前的cpu和内存使用率?
自己解析HTML可以,但是DHTML你怎么解析?自己写Javascript、VBScript和JScript引擎?
http://www.vckbase.com/document/viewdoc/?id=646===========================
见过“网际快车”的“使用网际快车下载全部链接”这个功能吗?想实现它,我们可以这样做:
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");
}
}
}
} } }
}
}
}
本程序在VC7+WINXP下编译通过,详细请看源代码!