一、不得不說的廢話
我知道用 MSHTML 的 IHTMLDocument2 的 get_links 獲取 IHTMLElementCollection 接口,通過 IHTMLElementCollection 來獲取 IHTMLAnchorElement,再通過 IHTMLAnchorElement 接口的get_href 我們就可以得到網頁的所有鏈接了!但這是用 MSHTML 的辦法,就我本人而言,總喜歡自己來搞,不喜歡用看不到內部的東西(雖然 microsoft 寫得比我的好)。所以,我就自己封裝了一個通過分析網頁標記字符,來獲取 url 的類,這個類我知道有缺陷,所以就公布出來,希望有人能在我這個類的基礎上從新搞出一個更好的新版本。
二、關於這個類
也許有人要說,分析網頁的url不就是分析 href=…什麼的不就可以了嗎?但是說起來很多事情是容易的,但要盡可能的做好一個事情,也知道真正的去嘗試了才會知道。比如 有的連接是這樣的 url=…。比如 javascript 裡面的連接(我現在分析javascript的部分也很有問題),比如 相對地址的and so on……在這個類裡面能處理的我已經盡可能的處理了,無奈我的水平有限,還不是很完美。
三、這個類的接口
接口函數只有一個就是這個類的構造函數 ,下面是這個函數的聲明:
CWebHost(const CString& m_str_webcode, /*網頁代碼*/
vector<HyperLink>& m_vec_URL, /*分析得到的url和url標題的結構*/
CString& str_URL); /*本頁的url*/
HyperLink 是一個結構我放在URLSturct文件裡面:
//URLSturct_.h
//超連接數據結構
#ifndef _____HyperLinkTag_h____
#define _____HyperLinkTag_h____
//超連接數據集
typedefstruct tagHyperLinkTag{
//link address;
CString str_Hyperlink;
//link text;
CString str_HyperlinkText;
}HyperLink;
#endif
四、這個類的函數列表
函數名字 功能 CWebHost(……); 構造函數 void OnRetrunWebContent(……); 返回所有鏈接 void OnGetHtmlURL(……); 獲取html的url void OnGetJumpURL(……); 獲取跳轉的url void OnReturnFrameURL(……); 獲得嵌套代碼的URL CString OnConversionURL(……); 把URL轉換成絕對地址 void OnAnalyseJavascrript(……); 返回Javascript代碼裡的URL CString OnGetLinkText(……); 取URL連接文字五、這個類的處理流程
六、詳細代碼
代碼太多,限於篇幅,所以有勞各位到源代碼裡面去看。
七、還是想說些廢話
該類分析上是存在缺陷的,希望大家多多提出問題,或者干脆你就從新寫出一個類來。從小我的語文水平就爛,寫得不明白請不要見怪。
編譯通過 VC7.1+Windows Server 2003
本文配套源碼