2012-02-25 5 views
0

どのようにして、Cを使用してHTML文書内の< ...>タグ間でHTMLを取り除くことができますか?私の現在のプログラムは、ウェブページの内容を取得するためにカールを使用し、それをテキストファイルに入れてから、テキストファイルから読み込み、<>を削除しますが、それらのタグ間のすべてを削除する方法はわかりません。 (あなたが他の宣言にネストつのタグを持っていないことを意味し、あなたが適切なHTMLを扱うことを想定し「<」と「>」タグの間に内容を削除するだけで、コードを配置Cストリップhtmlの間<...>

#include <curl/curl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <unistd.h> 

#define WEBPAGE_URL "http://homepages.paradise.net.nz/adrianfu/index.html" 
#define DESTINATION_FILE "/home/user/data.txt" 

size_t write_data(void *ptr, size_t size, size_t nmeb, void *stream) 
{ 
return fwrite(ptr,size,nmeb,stream); 
} 

int main() 
{ 
int in_tag = 0; 
char * buffer; 
char c; 
long lSize; 
size_t result; 

FILE * file = fopen(DESTINATION_FILE,"w+"); 
if (file==NULL) { 
    fputs ("File error",stderr); 
    exit (1); 
    } 

CURL *handle = curl_easy_init(); 
curl_easy_setopt(handle,CURLOPT_URL,WEBPAGE_URL); /*Using the http protocol*/ 
curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION, write_data); 
curl_easy_setopt(handle,CURLOPT_WRITEDATA, file); 
curl_easy_perform(handle); 
curl_easy_cleanup(handle); 

    int i, nRead, fd; 
    int source; 
    char buf[1024]; 


    if((fd = open("data.txt", O_RDONLY)) == -1) 
    { 
     printf("Cannot open the file"); 
    } 
    else 
    { 
     nRead = read(fd, buf, 1024); 
     printf("Original String "); 
     for(i=0; i<nRead; i++) 
     { 
       printf("%c", buf[i]); 
     } 

     printf("\nReplaced String "); 

     for(i=0; i<nRead; i++) 
     { 
      if(buf[i]=='<' || buf[i]=='>'){ 
      buf[i]=' '; 

      } 
      printf("%c", buf[i]); 
     } 
    } 
    close(source); 

return 0; 
} 
+1

を処理します。 '<'でカウンタをインクリメントし、 '>'でカウンタをインクリメントします。カウンタがゼロの場合のみ出力を行います。 (fencepostエラーに注意してください) – wildplasser

答えて

2

<html < body> >のように)。私はちょうどあなたのコードの小さな部分を変更しています。また、私が間違っていると正しいと思うので、望ましくない文字を間隔で置き換えるのではなく、buf変数からタグを削除します。

int idx = 0; 
int opened = 0; // false 
for(i=0; i<nRead; i++) 
{ 
    if(buf[i]=='<') { 
     opened = 1; // true 
    } else if (buf[i] == '>') { 
     opened = 0; // false 
    } else if (!opened) { 
     buf[idx++] = buf[i]; 
    } 
} 
buf[idx] = '\0'; 
printf("%s\n", buf); 
+0

これは私が欲しかったものです.HTMLを取り除きます。しかし、タグ間の最初のテキストのみを印刷するように見えます。例えば、 ...タグの間に印刷されます。ご協力いただきありがとうございます。 – user667430

+0

foo」についてはどうですか?それは有効なHTMLです。私はあなたが "開いた"山括弧のためのカウンターを必要とすると思います。 – Gandaro

+0

タグ間の最初のテキストを意味しますか:複数のタグが最初のタグの内容のみを印刷するのでしょうか?それとも、私は何とか1つのタグの内容を切り捨てますか?そのようなことが起こる理由は見当たりません。 –

1

また、これはあなたが最小限のステート・マシンを作ることができ、スクリプトやスタイルのタグ

int stripHTMLTags(char *sToClean,size_t size) 
    { 
     int i=0,j=0,k=0; 
     int flag = 0; // 0: searching for < or & (& as in &bspn; etc), 1: searching for >, 2: searching for ; after &, 3: searching for </script>,</style>, --> 
     char tempbuf[1024*1024] = ""; 
     char searchbuf[1024] = ""; 

     while(i<size) 
     { 
      if(flag == 0) 
      { 
       if(sToClean[i] == '<') 
       { 
        flag = 1; 

        tempbuf[0] = '\0'; 
        k=0; // track for <script>,<style>, <!-- --> etc 
       } 
       else if(sToClean[i] == '&') 
       { 
        flag = 2; 
       } 
       else 
       { 
        sToClean[j] = sToClean[i]; 
        j++; 
       } 
      } 
      else if(flag == 1) 
      { 
       tempbuf[k] = sToClean[i]; 
       k++; 
       tempbuf[k] = '\0'; 

       //printf("DEBUG: %s\n",tempbuf); 

       if((0 == strcmp(tempbuf,"script"))) 
       { 
        flag = 3; 

        strcpy(searchbuf,"</script>"); 
        //printf("DEBUG: Detected %s\n",tempbuf); 

        tempbuf[0] = '\0'; 
        k = 0; 
       } 
       else if((0 == strcmp(tempbuf,"style"))) 
       { 
        flag = 3; 

        strcpy(searchbuf,"</style>"); 
        //printf("DEBUG: Detected %s\n",tempbuf); 

        tempbuf[0] = '\0'; 
        k = 0; 
       } 
       else if((0 == strcmp(tempbuf,"!--"))) 
       { 
        flag = 3; 

        strcpy(searchbuf,"-->"); 
        //printf("DEBUG: Detected %s\n",tempbuf); 

        tempbuf[0] = '\0'; 
        k = 0; 
       } 

       if(sToClean[i] == '>') 
       { 
        sToClean[j] = ' '; 
        j++; 
        flag = 0; 
       } 

      } 
      else if(flag == 2) 
      { 
       if(sToClean[i] == ';') 
       { 
        sToClean[j] = ' '; 
        j++; 
        flag = 0; 
       } 
      } 
      else if(flag == 3) 
      { 
       tempbuf[k] = sToClean[i]; 
       k++; 
       tempbuf[k] = '\0'; 

       //printf("DEBUG: %s\n",tempbuf); 
       //printf("DEBUG: Searching for %s\n",searchbuf); 

       if(0 == strcmp(&tempbuf[0] + k - strlen(searchbuf),searchbuf)) 
       { 
        flag = 0; 
        //printf("DEBUG: Detected END OF %s\n",searchbuf); 

        searchbuf[0] = '\0'; 
        tempbuf[0] = '\0'; 
        k = 0; 
       } 
      } 

      i++; 
     } 

     sToClean[j] = '\0'; 

     return j; 
    } 
関連する問題