问答的形成-C++ 提取百度知道内容

因为项目 需要一份问答库进行测试

故提取百度知道内容

仅对如下链接格式的内容进行提取

zhidao.baidu.com/question/N.html

数字N的取值从0开始

bool PostHttpPage(const string& hostName, const string& pathName, const string& postData,int fileId)
{
	using namespace std;
	//fileId--;
	//创建一个会话对象来初始化WINNET库
	CInternetSession session("my session ");
	//连接对象
	CHttpConnection* pConnect=NULL;

	try
	{
		INTERNET_PORT nPort = 80;
		DWORD dwRet = 0;
		//建立连接,从session中获取,不用自己创建
		pConnect = session.GetHttpConnection(hostName.c_str(), nPort);

		CHttpFile* pFile = pConnect->OpenRequest(CHttpConnection::HTTP_VERB_POST, pathName.c_str());
 
		CString strHeaders = "Content-Type: application/x-www-form-urlencoded"; // 请求头
 
		//开始发送请求
 
		pFile->SendRequest(strHeaders,(LPVOID)postData.c_str(),postData.size());
		pFile->QueryInfoStatusCode(dwRet);
 
 
		if (dwRet == HTTP_STATUS_OK)
		{
			CString result, newline;
			int flag=0;
			//
			string key;
			string ques;
			string ans;
			//新的请求才会置零
			int tFlag=0;

			int start;
			int end;

			while(pFile->ReadString(newline))
			{//循环读取每行内容
				//result += newline+"\r\n";
				//std::cout<<newline<<std::endl;
				//Sleep(300);
				//
				//在这里对提取的信息进行处理

			
				//某些已经被删或者不存在啥的,就跳过
				int i=newline.Find("百度知道 - 信息提示");
				if(string::npos!=i)
					break;

				//可能问题中包含图片,也可以直接忽略了
				/*int j=newline.Find("img class=\"word-replace\"");
				i=newline.Find("img class=\"ikqb_img\"");
				i=i<j?i:j;*/
				i=newline.Find("img class=");
				if(string::npos!=i)
					break;

				//找关键字
				i=newline.Find("<meta name=\"keywords\" content=\"");

				if (string::npos!=i)
				{
					//string ss=newline.GetBuffer();
					start=i+strlen("<meta name=\"keywords\" content=\"");
					end=newline.Find(">");
					end-=2;
					key=newline.Mid(start,end-start);

					//鉴于检索引擎编码上存在问题,就去掉没有关键字的吧
					if(!strcmp(key.c_str(),""))
						break;

					tFlag++;
					continue;
				}
				//找具体问题内容
				i=newline.Find("<span class=\"ask-title\">");
				if(string::npos!=i)
				{
					start=i+strlen("<span class=\"ask-title\">");;
					end=newline.Find("</span>");

					ques=newline.Mid(start,end-start);
					tFlag++;
					continue;

				}


				//找答案
				//先只找一个
				/*i=newline.Find("recommend-content");
				int j=newline.Find("answer-content");
				i=i>j?i:j;*/
				//i=newline.Find("answer-content");
				i=newline.Find("class=\"answer-text mb-10\">");
				if (string::npos!=i)
				{
					newline.Replace("<br />","");
					newline.Replace("</ br>","");
					start=i+strlen("class=\"answer-text mb-10\">");
					end=newline.Find("</pre>");
					ans=newline.Mid(start,end-start);
					tFlag++;
					break;
				}	

			}
			//tFlag等于3的时候才认为信息完全
			if(tFlag==3)
			{
				cout<<"key:"<<key<<endl;
				cout<<"ques:"<<ques<<endl;
				cout<<"ans:"<<ans<<endl;
				AddChildren(key,ques,ans,fileId);//这个函数是向文件中增加子节点的,libxml2实现

			}



			//std::cout<<result<<std::endl;//显示返回内容
		}
		else
		{
			return false;
		}
		delete pFile;
		if(pConnect!=NULL)
		{
			pConnect->Close();
			delete pConnect;
		}
 
	}
	catch (CInternetException* pEx)
	{
		//catch errors from WinInet
		TCHAR pszError[200];
		pEx->GetErrorMessage(pszError, 200);
 
		std::cout<<pszError<<std::endl;//显示异常信息
		return false;
	}
	session.Close();
 
	return true;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值