做了個用c語言分析HTML標籤的簡單程序.
設計思路是這樣的.
1. 標籤起始終止查找方法:
int foundtag(const char *str, int *start, int *end) ;
傳入一字串, 尋找第一個 "<"為開始, 下一個 ">"為結束,, 正確則返回 0,
如為""
2. 處理整個文件.
讀入定長字串到buffer,
上次處理end 之後的字串+ 本次讀入字串一起做為參數 由foundtag處理
,返回0,0,-->start間字符為文字, start--> end 間為標籤, 否則繼續讀取文件, 直到結束.
int HTML_ParseFile(FILE *in, HTML_Parser Parser)
{
char bs[buffersize+1] ;
char tbs[buffersize*2+1] ;
int size ;
char *p ;
tbs[0] = '\0' ;
while ((size = fread(bs, 1, buffersize, in)) >0 ) {
bs[size] = '\0';
assert( (size+ strlen(tbs)) < buffersize *2) ;
strcat(tbs,bs) ;
HTML_ParserStr(Parser, tbs, &p) ;
strcpy(tbs, p) ;
}
return 0 ;
}
3. 如何處理標籤.
使用函數指針, 函數由調用程序傳入, 如為NULL,則不處理.
struct HTML_ParserStruct
{
int (*startElementHandle)(void *userData, const char *Element) ;
int (*endElementHandle)(void *userData, const char *Element) ;
int (*startTextHandle)(void *userData, const char *Text) ;
void *userData ;
} ;
4. 用戶調用.
int startElement (void *userData, const char *Element) ;
int endElement (void *userData, const char *Element) ;
int startText (void *userData, const char *text) ;
上面三個函數定義如何處理解析程序分析到的數據
int main(int argc, char *argv[])
{
int x = 0 ;
HTML_Parser p = HTML_ParserCreate() ;
HTML_SetStartElementHandler(p, &startElement) ;
HTML_SetStartTextHandler(p, &startText) ;
HTML_SetEndElementHandler(p, &endElement) ;
HTML_SetUserData(p, &x) ;
HTML_ParseFile(stdin, p) ;
fclose(fp) ;
HTML_ParserFree(p) ;
exit(EXIT_SUCCESS);
}
我用它來分析網頁中的所有URL,
准備變化一下用來搜索mp3.baidu.com上喜歡聽的歌曲.
阅读(3141) | 评论(4) | 转发(0) |