五、解析網頁源代碼,得到所需要信息
- #define ARTICLE_TITLE ("<div class=\"article_title\">")
- #define ARTICLE_MANAGE ("<div class=\"article_manage\">")
- #define BLOG_TITLE ("<div class=\"blog_title\">")
- #define URL_LINK ("<a href=")
- #define LINK_TITLE ("<span class=\"link_title\"><a href=")
- #define LINK_TITLE_END ("</a></span>")
- #define LINK_VIEW ("<span class=\"link_view\"")
- #define LINK_COMMENTS ("<span class=\"link_comments\"")
- #define LINK_POSTDATE ("<span class=\"link_postdate\">")
- #define BLOG_RANK ("<ul id=\"blog_rank\">")
- #define BLOG_STATISTICES (" <ul id=\"blog_statistics\">")
- #define URL_END ("</a>")
- #define DIV_END ("</div>")
- #define SPAN ("<span>")
- #define SPAN_END ("</span>")
- #define UL_END ("</ul>")
1、從保存的首頁中讀1024字節到數組。
2、strcat到2048個字節的數組,多定義一個2048字節的數組,就是爲了解決查找標籤有可能只讀到一部分的情況。
3、判斷狀態,自定義5個狀態
- #define TAG_RESOLV_ARTICLE 0 //解析文章標題、URL
- #define TAG_RESOLV_ARTICLE_STATIS 1//解析文章訪問信息
- #define TAG_RESOLV_RANK 2//解析博主博客的訪問信息
- #define TAG_RESOLV_STATIS 3//解析博主文章統計
- #define TAG_RESOLV_END 4//解析結束
4、根據狀態查找相應的標籤位置。
如果狀態爲TAG_RESOLV_RANK,則查找<ulid="blog_rank">和</ul>是否在數組中。只有兩個標籤同時在數組中,才解析標籤所包含的有用信息。當<ulid="blog_rank">存在,而</ul>不存在時,則丟掉<ulid="blog_rank">之前的數據,在讀1024字節數據後在解析。引用我自己寫的一段代碼來分析一下。
- /*
- *功能:解析博客排名,訪問量等。
- */
- int resolvBlogRank(char *buf, int len, struct BloggerInfo *blogger, int *tag) {
- char *blog_rank_start, *blog_rank_end, *span_start, *span_end;
- char tmpbuf[BUFFERLEN * 2];
- int roll_back_loc,buf_len;
- bzero(tmpbuf, sizeof (tmpbuf));
- blog_rank_start = strstr(buf, BLOG_RANK);//找到BLOG_RANK第一次出現的位置(呵呵,只會出現一次)
- if (blog_rank_start == 0) {//如果buf數組裏面沒有出現BLOG_RANK,則只保留buf數組最後200個字節。爲什麼是200?主要是因爲BLOG_RANK所包括的字符長度目前不會超過200哈。
- buf_len=strlen(buf);
- roll_back_loc=buf_len-200>0?buf_len-200:0;
- strcat(tmpbuf, buf + roll_back_loc);
- bzero(buf, len);
- strcat(buf, tmpbuf);
- } else {//BLOG_RANK出現在buf裏面
- blog_rank_end = strstr(blog_rank_start + strlen(BLOG_RANK), UL_END);//找與<span style="white-space: pre-wrap; ">BLOG_RANK對應的結尾標籤,這裏是</ul></span>
- if (blog_rank_end == 0) {//UL標籤沒有找到,則保留BLOG_RANK之後的數據
- strcat(tmpbuf, blog_rank_start);
- bzero(buf, len);
- strcat(buf, tmpbuf);
- } else {//UL標籤找到
- span_start = strstr(blog_rank_start + strlen(BLOG_RANK), SPAN);
- span_end = strstr(span_start + strlen(SPAN), SPAN_END);
- blogger->visits = myatoi(span_start + strlen(SPAN), span_end);//myatoi函數是我自己寫的,用於將字符串轉換爲整數。如“第10000名”=》10000
- span_start = strstr(span_end + strlen(SPAN_END), SPAN);
- span_end = strstr(span_start + strlen(SPAN), SPAN_END);
- blogger->integral = myatoi(span_start + strlen(SPAN), span_end);
- span_start = strstr(span_end + strlen(SPAN_END), SPAN);
- span_end = strstr(span_start + strlen(SPAN), SPAN_END);
- blogger->ranking = myatoi(span_start + strlen(SPAN), span_end);
- *tag = TAG_RESOLV_STATIS;
- strcat(tmpbuf, blog_rank_end + strlen(UL_END));
- bzero(buf, len);
- strcat(buf, tmpbuf);
- }
- }
- return 0;
- }
5、循環,直到所解析的內容解析完畢