Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418647
  • 博文数量: 66
  • 博客积分: 1416
  • 博客等级: 上尉
  • 技术积分: 922
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-16 10:37
个人简介

高級Oracle DBA,善長Linux系統維運以及Oracle數據庫管理,開發,調優. 具有多年PL/SQL開發經驗.

文章分类

全部博文(66)

文章存档

2015年(9)

2014年(4)

2013年(5)

2010年(1)

2009年(3)

2008年(6)

2007年(30)

2006年(8)

我的朋友

分类: C/C++

2006-11-23 14:54:58

做了個用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) |
给主人留下些什么吧!~~

chinaunix网友2008-06-16 16:56:33

呵呵,你这种方法不知道怎么样,但是CSDN上的这篇思路绝佳,实现也比较容易。 http://blog.csdn.net/RonoTian/archive/2008/06/06/2517568.aspx

chinaunix网友2008-03-10 10:48:14

函数名变量名一塌糊涂, C语言也要写好看一些呀。