zoukankan      html  css  js  c++  java
  • C++ 提取网页内容系列之一

    标 题: 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

  • 相关阅读:
    Redis-cluster集群【第二篇】:redis持久化
    Redis-cluster集群【第一篇】:redis安装及redis数据类型
    django2.0 官方中文文档地址
    jenkins设置CSRF 协议(CRUMB值设置)
    elasticsearch-dump 迁移es数据 (elasticdump)
    大独裁者最后演讲台词
    面向对象的弊端是什么(转)
    IntelliJ IDEA 破解
    Django 2.0.1 官方文档翻译:接下来读什么(page 14)
    Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)
  • 原文地址:https://www.cnblogs.com/itdef/p/4171179.html
Copyright © 2011-2022 走看看