#include "get_detail_from_html.h"
#define LINE_LEN 1024
#define DAY_TAG_STRING "今天白天"
#define NIGHT_TAG_STRING "今天夜间"
#define PHP_NAME "/tmp/weather.php"
#define HTML_NAME "/tmp/weather.html"
typedef struct _info
{
unsigned char DON;//白天还是夜间,0:day,1:night
char t[16];//实际温度
char f[16];//体感温度
char type[16];//天气类型
char wing[32];//风向
}info_t;
typedef struct _weather
{
info_t day;
info_t night;
unsigned char gd;
unsigned char gnt;
}weather_t,*weather_p;
//int readfile(const char* filename);
int get_weather_info(const char* filename,weather_p info);
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: %s \n",argv[0]);
}
char* cityname=argv[1];
char cmd[128];
pid_t pid;
weather_t weather;
memset(&weather,0,sizeof(weather_t));
weather.day.DON=0;
weather.night.DON=1;
printf("Connecting ...\n");
//get the weather file from sina weather web by
//wget -O weather.php
//and turn gbk to utf8 by iconv -f gbk -t utf8 xxx.php > xxx.html
sprintf(cmd,"wget -q -O %s %s",PHP_NAME,cityname);
system(cmd);
sprintf(cmd,"iconv -f gbk -t utf8 %s > %s",PHP_NAME,HTML_NAME);
system(cmd);
//switch(readfile(filename))
switch(get_weather_info(HTML_NAME,&weather))
{
case 0:
printf("%s's weather is:\n",cityname);
if(weather.gd)
{
printf("day:\t%s\t%s\t%s\n",weather.day.t,weather.day.type,weather.day.wing);
}
if(weather.gnt)
{
printf("night:\t%s\t%s\t%s\n",weather.night.t,weather.night.type,weather.night.wing);
}
break;
default:
printf("error.please try again and make sure the city name be true.\n");
break;
}
return 0;
}
int get_weather_info(const char* filename,weather_p weather)
{
FILE *fp;
char rline[LINE_LEN];
int flag=0;
char* rs;
if((fp = fopen(filename,"r"))==NULL)
{
perror("fopen");
return -1;
}
while(1)
{
rs=fgets(rline,LINE_LEN,fp);
if(flag==2 || rs==NULL || !strlen(rline)) break;
if(strstr(rline,DAY_TAG_STRING))
{
flag=1;
//printf("%s\n",rline);
//get day weather information.
err_info err;
weather->gd=1;
while(!strstr(fgets(rline,LINE_LEN,fp),"
"));
get_detail_from_html(rline,weather->day.t,sizeof(weather->day.t),"span",&err);
if(err!=ERR_NO)
{
weather->gd=0;
printf("day t error: %s\n",get_err_info(err));
}
fgets(rline,LINE_LEN,fp);
get_detail_from_html(rline,weather->day.type,sizeof(weather->day.type),"li",&err);
if(err!=ERR_NO)
{
weather->gd=0;
printf("day type error: %s\n",get_err_info(err));
}
fgets(rline,LINE_LEN,fp);
get_detail_from_html(rline,weather->day.wing,sizeof(weather->day.wing),"li",&err);
if(err!=ERR_NO)
{
weather->gd=0;
printf("day wing error: %s\n",get_err_info(err));
}
}
if(strstr(rline,NIGHT_TAG_STRING))
{
flag=2;
//printf("%s\n",rline);
//get day weather information.
weather->gnt=1;
err_info err;
while(!strstr(fgets(rline,LINE_LEN,fp),""));
get_detail_from_html(rline,weather->night.t,sizeof(weather->night.t),"span",&err);
if(err!=ERR_NO)
{
weather->gd=0;
printf("night t error: %s\n",get_err_info(err));
}
fgets(rline,LINE_LEN,fp);
get_detail_from_html(rline,weather->night.type,sizeof(weather->night.type),"li",&err);
if(err!=ERR_NO)
{
weather->gd=0;
printf("night type error: %s\n",get_err_info(err));
}
fgets(rline,LINE_LEN,fp);
get_detail_from_html(rline,weather->night.wing,sizeof(weather->night.wing),"li",&err);
if(err!=ERR_NO)
{
weather->gd=0;
printf("night wing error: %s\n",get_err_info(err));
}
}
}
fclose(fp);
return 0;
}
################################
get_detail_from_html.h
#ifndef GET_DETAIL_FROM_HTML_H
#define GET_DETAIL_FROM_HTML_H
typedef enum _err_info
{
ERR_NO=0,
ERR_NOT_FIND,
ERR_DST_SHORT
}err_info;
char* get_detail_from_html(const char* source,char* dst,size_t s_t,const char* html_flag,err_info* err);
char* get_err_info(err_info err);
#endif //GET_DETAIL_FROM_HTML_H
###############################
get_detail_from_html.c
#include
#include
#include "get_detail_from_html.h"
char* get_detail_from_html(const char* source,char* dst,size_t s_t,const char* html_flag,err_info* err)//html_flag e.g: body
{
char *s=NULL,*e=NULL,*d=NULL;
char html_end[32];
sprintf(html_end,"%s>\0",html_flag);
d=dst;
//判断是否存在标签
s=(char*)source;
e=s;
while((s=strstr(e,html_flag)))
{
if(*(s-1)=='<') break;
e=s+1;
}
if(!s)
{
*err=ERR_NOT_FIND;
return s;
}
if(!(e=strstr(s,html_end)))
{
*err=ERR_NOT_FIND;
return e;
}
while(*s!='>' && s
if(!(s {
*err=ERR_NOT_FIND;
return (char*)0;
}
//存在标签
s++;
if(s_t<(e-s-1))
{
printf("%d:%d\n",s_t,(e-s-1));
*err=ERR_DST_SHORT;
return (char*)0;
}
memcpy(dst,s,e-s);
dst[e-s]='\0';
*err=ERR_NO;
return d;
}
char* get_err_info(err_info err)
{
switch(err)
{
case ERR_DST_SHORT:
return "dst lenght is too short.";
break;
case ERR_NOT_FIND:
return "cannot find tag.";
break;
case ERR_NO:
return "";
break;
default:
return "Unknow error.";
break;
}
}
#############################
Makefile
CC=gcc
OBJ=weather.o get_detail_from_html.o
all:weather
weather:$(OBJ)
$(CC) $^ -o $@
weather.o:weather.c get_detail_from_html.h
$(CC) -c $< -o $@
get_detail_from_html.o: get_detail_from_html.c get_detail_from_html.h
$(CC) -c $< -o $@
clean:
-rm weather $(OBJ)
############################