注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

长风明志的博客

不要也不能做下一个谁,应该且可以做第一个自己

 
 
 

日志

 
 

C++简单实现抽取网页链接  

2012-10-20 23:44:42|  分类: 搜索引擎 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
使用C++提取html页面中链接,能够提取出正常的网页链接,对部分网页如百度首页,抽取出来的部分链接有问题,有待进一步完善:
Source code:

/*
抽取出网页中的所有链接
@changfengmingzhi
*/
#include <iostream>
#include <fstream>
#include <map>
#include <string>
using namespace std;
int main()
{
const char* filepath=".\\长风明志的博客 - changfengmingzhi - 网易博客.htm"; //网页文件路径
map<string,int> mapLink; //容器用于存放抽取出来的链接和计数
string line; //一行数据
string htmlcontent; //html文件内的所有内容
ifstream readfile(filepath);
if(!readfile) //打开文件失败
{
cout<<"打开文件失败!"<<endl;
return 0;
}
else
{
while(getline(readfile,line)) //一行行读取html文件
{
htmlcontent+=line+"\n";
}
string::size_type st1,st2;
string strlink; //一条链接
string baseurl; //基准url,用于相对路径
st1=htmlcontent.find("base href=\"");
st2=htmlcontent.find("\"",st1+11);
if(st1!=string::npos&&st2!=string::npos)
{
baseurl=htmlcontent.substr(st1+11,st2-(st1+11));
}
st1=0;
while(true) //抽取出链接
{
st1=htmlcontent.find("href=\"",st1); //找到链接的开始标记href="
if(st1!=string::npos) //若存在链接
{
st2=htmlcontent.find("\"",st1+6); //找到链接的结束标记"
strlink=htmlcontent.substr(st1+6,st2-(st1+6)); //截取子字符串,即链接
if(strlink.find("http://")!=0) //不是以http://开头的链接加上baseurl
{

if(!baseurl.empty())
{
strlink=baseurl+strlink;
}
else
{
strlink.erase();
st1=st2+1;
continue;
}
}
mapLink[strlink]++; //将链接加入容器,并计数
strlink.erase();
st1=st2+1;
}
else
{
break;
}
}
for(map<string,int>::iterator it=mapLink.begin();it!=mapLink.end();it++)
{
cout<<it->first<<"---计数:"<<it->second<<endl;
}

}
return 0;
}



  评论这张
 
阅读(1864)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017