Извлечение вики-ссылок с помощью C - PullRequest
0 голосов
/ 09 октября 2018

Мне нужно написать программу, которая читает исходный файл Википедии и извлекает все ссылки на другие веб-страницы.Все веб-страницы выглядят как пример:

<a href="/wiki/PageName" title="PageName">Chicken</a>

Мне нужно сопоставить PageName после / wiki / с заголовком и, если они такие же, как и выше, отобразить только PageName на терминале.

Однако следующее не должно совпадать, поскольку оно не в том же формате, что и выше: <a href="http://chicken.com>Chicken</a> (это ссылка на обычный сайт из Википедии) <a href="/wiki/Chicken >Chicken</a> (отсутствует заголовок = раздел)Вывод, который я пытаюсь получить, выглядит примерно так:

Пример вывода, который я пытаюсь достичь

Я работал над этим довольно давно и смогчтобы сделать следующее:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
  FILE * file;
  file = fopen(argv[1], "r");

  char line[512];
  char* search;

  while(!feof(file)){
    fgets(line,512,file);

    search = strstr( line, "<a href=\"/wiki/");

    if(search != NULL){
        puts(search);
    }
  }
}

Код отфильтровывается только до / wiki /, но я не заполнен.Я пытался много искать, но не смог получить преимущество.Помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018
size_t sz;
fseek(file, 0L , SEEK_END);
sz=ftell(file);
rewind(file);
char line[sz+1];

Это, вероятно, исправит ошибку сегментации.

0 голосов
/ 09 октября 2018

Вместо while(!feof(file)) вы можете использовать while(fgets(line,512,file)) и, добавив пару проверок, ваш конечный код с ожидаемым выводом будет выглядеть так:

#ifdef  _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif //  MSC

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE * file;

    if (argc != 2)
    {
        return -1;
    }

    file = fopen(argv[1], "r");

    if (!file)
    {
        return -1;
    }
    char line[512];
    char* search;

    while (fgets(line, 512, file)) {
        search = strstr(line, "<a href=\"/wiki/");

        if (search != NULL) {
            char *title = _strdup(search);
            if (title)
            {
                char* start = strstr(title, ">");
                char* end = strstr(start, "<");
                if (end)
                {
                    *end = 0;
                }
                if (strlen(start) >= 2)
                {
                    puts(start + 1);
                }
                free(title);
                title = 0;
            }
        }
    }
    fclose(file);
    file = NULL;
    return 0;
}
...