標 題: C++ 提取網頁內容系列
作 者: itdef
鏈 接: http://www.cnblogs.com/itdef/p/4171179.html
歡迎轉帖 請保持文本完整並注明出處
首先分析網頁就要下載網頁內容 這里給出了兩種方案
一種是使用MFC自帶函數
代碼如下:
int GetHttpFileData(CString strUrl,char* szDownloadHtmFileName)
{
CInternetSession Session("Internet Explorer", 0);
CHttpFile *pHttpFile = NULL;
CString strData;
CString strClip;
int iRet = -1;
if(szDownloadHtmFileName == NULL)
{
cerr << "DownloadHtmFileName is NULL" << endl;
Session.Close();
return iRet;
}
ofstream of(szDownloadHtmFileName);
if (of.bad())
{
cerr << "of create file error" << endl;
Session.Close();
return iRet;
}
try
{
pHttpFile = (CHttpFile*)Session.OpenURL(strUrl);
while ( pHttpFile->ReadString(strClip) )
{
of << strClip;
}
}catch(CInternetException* pEx)
{
TCHAR pszError[64];
pEx->GetErrorMessage(pszError, 64);
cerr << __FUNCTION__ << pszError << endl;
goto GetHttpFileData_EXIT;
}
iRet = 0;
GetHttpFileData_EXIT:
Session.Close();
of.close();
return iRet;
}
這里我將下載內容寫入了一個文件存入硬盤。另外還需要注意的是 網頁文件下載的格式可能是寬字節 使用UTF8格式,這里需要將其轉換為GBK多字節。
int UTF8Str2GBK(const string& strUTF8,string& strGBK)
{
int i = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
WCHAR *wsz = NULL;
TCHAR *tsz = NULL;
int iRet = -1;
wsz = new WCHAR[i+1];
if( NULL == wsz)
{
goto UTF8Str2GBK_EXIT;
}
MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, wsz, i);
i = WideCharToMultiByte(CP_ACP, 0, wsz, -1, NULL, 0, NULL, NULL);
tsz = new TCHAR[i+1];
if( NULL == tsz)
{
goto UTF8Str2GBK_EXIT;
}
WideCharToMultiByte(CP_ACP, 0, wsz, -1, tsz, i, NULL, NULL);
strGBK = string(tsz);
iRet = 0;
UTF8Str2GBK_EXIT:
delete []wsz;
delete []tsz;
return iRet;
}
全部代碼見 http://www.oschina.net/code/snippet_614253_43732
效果圖見 http://www.cnblogs.com/itdef/p/4081963.html
