2013-03-12 4 views
1

Добрый день, надеюсь, вы сможете мне помочь. Я должен написать этот код (в C), который загружает источник страницы на веб-сайт и сохраняет его в html-файле (я уже это сделал). Следующая часть - извлечь текст с этого сайта, используя сохраненный html-файл.Извлечение чистого текста из файла HTML

У меня есть этот алгоритм шагов в моей голове:

Скажем, у нас есть HTML-файл, содержащий:

< что-то здесь> < начать> < текст> Hello < текст> BYE! < end> ​​

  1. Найти строку "", пропустить строку "". (это может быть реализовано с помощью strstr())
  2. Установите указатель на первый «>» в ​​«». (используйте strchr() ??)
  3. Проверьте, соответствует ли следующий символ в строке «<»: (игнорирует пробелы) a.) Если да, установите указатель на следующий «>». Повторить проверку (3). b.) Если нет, получите строку до следующего «<». Затем сохраните (добавьте) его в большую строку.
  4. Наконец, я хотел бы сохранить String в file.txt. (fwite? или вариант a + в fopen()).

Логично, это правильно? Как новичок в программировании, я всегда получаю ошибки. Я написал код, но он всегда приводит к ошибке сегментации.

Пожалуйста, помогите мне/рассказать мне, что случилось с моим кодом: манекене - файл, содержащий 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; 

    } 
+4

Один делает а не просто проанализировать HTML –

+1

Какие именно элементы HTML вы хотите извлечь? Почему вы не используете библиотеку, которая может анализировать HTML/XML? –

+0

@MichaelFoukarakis, насколько это возможно, я не хочу использовать эти библиотеки сэр. Я все еще изучаю C, и мне поручено сделать это классическим способом. – Norman

ответ

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 для копирования строки в выделенной памяти.

+0

Спасибо, сэр! Я это заметлю. Я попробую это позже, когда я закодирую в Ubuntu. Сейчас я в Windows. – Norman

+0

Технически ни одна из них не может вызвать ошибку seg: char * больше, чем char, поэтому выделяется больше памяти. Кроме того, вы не можете читать за пределами eof, поэтому fread также является законным. Однако есть и другие ошибки в коде. – Aneri

1

У вас есть некоторые ошибки в коде, которые являются более серьезными, чем упоминалось в ответе Тони Лев. Рассмотрим это:

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

Последние две строки эффективно оказывают первые два бесполезных. Вы переназначаете постоянные строки для переменных.Когда вы затем sprintf до finalString, вы получите ошибку sig, поскольку строка является постоянной (и хранится в статической памяти с предопределенным размером - 1 символ).

Я бы посоветовал использовать стандартную разборную библиотеку. Вы должны заметить, что HTML не всегда правильно отформатирован, позволяет вложенные теги, некоторый текст следует игнорировать (например, внутри , style тегов и т. Д.).

Если вы все еще хотите сделать это самостоятельно, вам лучше пройти через вход, отслеживая, находитесь ли вы внутри тега, пропускаете эти символы или внутри открытого текста, добавляя этот текст к чему-то вроде вашей finalString.

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); 
     } 
} 
Смежные вопросы