2012-02-25 2 views
0

< ...> 태그를 포함하여 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

을 처리 할 것입니다. '<'에서는 카운터를 증가시키고 '>'는 카운터를 감소시킵니다. 카운터가 0이면 출력 만 수행하십시오. (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

이것은 또한 당신은 최소한의 상태 머신을 만들 수있는 스크립트와 스타일 태그

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; 
    } 
관련 문제