从HTML文件中提取纯文本

时间:2013-03-12 11:04:30

标签: c parsing

美好的一天,我希望你能帮助我。我必须编写这个代码(在C中)下载网站的页面源并将其保存到html文件(我已经这样做了)。下一部分是使用保存的html文件从该站点提取文本。

我脑子里有这个算法步骤:

假设我们有一个包含以下内容的html文件:

<这里的东西><开始><文字>你好<文字> BYE! <结束>

  1. 找到“”字符串,跳过“”字符串。 (这可以用strstr())
  2. 实现
  3. 将指针设置为第一个“>”的“”。 (使用strchr()??)
  4. 检查字符串中的下一个字符是否为“<”:(忽略空格) a。)如果是,请将指针设置为下一个“>”。重复检查(3)。 b。)如果不是,请将字符串直到下一个“<”。然后将它存储(附加)到一个大字符串。
  5. 最后,我想将String保存到file.txt。 (fwite?或fopen()中的选项a +。)。
  6. 从逻辑上讲,这是正确的吗? 作为编程的初学者,我总是会遇到错误。我编写了一个代码,但它总是导致分段错误。

    请帮助我/告诉我我的代码有什么问题: 虚拟 - 包含html代码的文件

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <unistd.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <time.h>
    
        int get_fileSize(FILE*);
    
        int main(){
    
            FILE *dummy = fopen("Dummy2","r");
    
            int filesize = get_fileSize(dummy);
            printf("Size of dummy = %d Bytes.\n", filesize);
    
            char *newString = (char*)malloc((sizeof(char*))*(filesize));
    
            if(dummy){
                fread(newString, sizeof(char*), filesize, dummy);
            }   
    
            char *tempString = (char*)malloc((sizeof(char*))*(filesize));
            char *finalString = (char*)malloc((sizeof(char*))*(filesize));
            finalString = "\0";
    
            tempString = strtok(newString, "<");
            do{
    
                //printf("%s\n",tempString);
                tempString = strtok(NULL, ">");
    
                if(tempString[1]!='<'){
                        sprintf(finalString,"%s%s",finalString,tempString);            
                }else continue;
    
            }while(*(newString++)!='\0');
    
            puts(finalString);
    
            return 0;
        }
    
        int get_fileSize(FILE *dummy){
    
            int size;
            struct stat file;
            fstat(fileno(dummy), &file);
            size = file.st_size;
    
            return size;
    
        }
    

3 个答案:

答案 0 :(得分:2)

第一个错误,只需看一眼您的代码就是sizeof(char*),而不只是char

char *newString = (char*)malloc((sizeof(char*))*(filesize));

应该是

char *newString = (char*)malloc((sizeof(char))*(filesize));

您不希望字符串中有指针,而是char s。

malloc以上,永远不会致电free(newString),这意味着您至少有1次泄密,可能更多。

同样在这里:

fread(newString, sizeof(char*), filesize, dummy);

应该是:

fread(newString, sizeof(char), filesize, dummy);


finalString = "\n"; //reassigns the pointer to another string, doesn't write into allocated memory.  

使用strcpy将字符串复制到已分配的内存中。

答案 1 :(得分:1)

你的代码中有一些错误,比Tony The Lion的答案中提到的更严重。考虑一下:

    char *tempString = (char*)malloc((sizeof(char*))*(filesize));
    char *finalString = (char*)malloc((sizeof(char*))*(filesize));
    finalString = "\0";
    tempString = strtok(newString, "<");

最后两行有效地使前两个无用。您将常量字符串重新分配给变量。当你sprintffinalString时,由于字符串是常量的(并存储在具有预定义大小的静态内存中,1个字符),因此会出现sig错误。

我建议使用一些标准的解析库。您必须注意,HTML并不总是格式正确,允许嵌套标记,必须忽略某些文本(例如内部scriptstyle标记等等)。

如果你仍然想自己做,你最好通过输入,跟踪你是否在标签内,跳过这些字符,或在纯文本内,将此文本添加到类似你的finalString。

答案 2 :(得分:0)

如果您正在获取文件大小,请使用它来控制循环(读取文件并不能确保在您阅读的内容中有一个零字节):

for (toggle = 0, i = 0; i < filesize; ++i) {
      if      (filearray[ i ] == '<')                toggle = 1;
      else if (filearray[ i ] == '>' && toggle != 0) toggle = 0;
      else if (!toggle) {
           printf("\nText char '%c' at %d", filearray[ i ], i);
      }
}