| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1206 人关注过本帖
标题:c语言正则表达式抓取网站的<title>
只看楼主 加入收藏
ail
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-1-29
收藏
 问题点数:0 回复次数:2 
c语言正则表达式抓取网站的<title>
本程序的功能是搜索网站的<title>字段的值
遗憾的是并不通用:ps:我也不知道为什么失败
求思路:

问题1:正则表达式或运算消除标签大小写后匹配不到字符串
问题2:正则表达式实现零宽断言后发现匹配不到字符串
问题3:在一些网站上测试<title>成功 在其他网站可能会失败

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <regex.h>//正则表达式

#define BUF_SIZE 512

int reptile_regex(char * buf);

char ch[100000];

int main(int argc,char *argv[])
{
struct sockaddr_in servAddr;
struct hostent * host;
int sockfd;
char sendBuf[BUF_SIZE],recvBuf[BUF_SIZE];
int sendSize,recvSize;

host=gethostbyname(argv[1]);
if(host==NULL)
{
perror("dns 解析失败");
}
servAddr.sin_family=AF_INET;
servAddr.sin_addr=*((struct in_addr *)host->h_addr);
servAddr.sin_port=htons(atoi(argv[2]));
bzero(&(servAddr.sin_zero),8);

sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("socket 创建失败");
}

if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-1)
{
perror("connect 失败");
}

//构建一个http请求
sprintf(sendBuf,"GET / HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\n\r\n",argv[1]);
if((sendSize=send(sockfd,sendBuf,BUF_SIZE,0))==-1)
{
perror("send 失败");
}
//获取http应答信息
memset(recvBuf,0,sizeof(recvBuf));
memset(ch,0,sizeof(ch));
char pattern[128]={0};
while(recvSize=recv(sockfd,recvBuf,BUF_SIZE,0)>0)
{
//printf("%s",recvBuf);
strcat(ch,recvBuf);
memset(recvBuf,0,sizeof(recvBuf));
}
reptile_regex(ch);

return 0;
}

//第一个参数是要匹配的字符串,第二个参数是匹配的规则,返回匹配的个数
int reptile_regex(char* buf)
{
const char* pattern="<TITLE>.*<\\/TITLE>";
int cflags= REG_EXTENDED;
const size_t nmatch=10;//结构体数组长度
regmatch_t pm[10];//结构体数组 存放匹配文本串的位置信息
regex_t reg;//正则表达式指针
char* str;
str=buf;//str目标字符串
regcomp(&reg,pattern,0);//编译匹配模式
while(regexec(&reg,str,nmatch,pm,0)==0)
{
for(int j=pm[0].rm_so;j<pm[0].rm_eo;++j)
{
printf("%c",str[j]);
}

printf("\n");
str=str+pm[0].rm_eo;
}
regfree(&reg);
return 0;
} 

搜索更多相关主题的帖子: 搜索网站 表达式 字符串 c语言 title 
2016-01-29 19:56
ail
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-1-29
收藏
得分:0 
为什么没有人回答我的问题
2016-02-01 17:44
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
regcomp(&reg, pattern, REG_ICASE);


[fly]存在即是合理[/fly]
2016-02-02 10:46
快速回复:c语言正则表达式抓取网站的<title>
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020977 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved