【问题标题】:Extracting Wiki links using C使用 C 提取 Wiki 链接
【发布时间】:2018-10-09 04:40:35
【问题描述】:

我需要编写一个程序来读取维基百科源文件并提取所有指向其他网页的链接。所有网页看起来像示例:

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

我基本上需要将 /wiki/ 之后的 PageName 与标题匹配,如果它们相同,如上,则在终端上仅显示 PageName。

但是,由于与上面的格式不同,因此不应匹配以下内容: &lt;a href="http://chicken.com&gt;Chicken&lt;/a&gt;(这是维基百科上一个普通网站的链接) &lt;a href="/wiki/Chicken &gt;Chicken&lt;/a>(缺少标题=部分) 我试图实现的输出如下所示:

Example output I am trying to achieve

我已经为此工作了很长时间,并且能够做到以下几点:

#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/ 但从这里开始我是空白的。我尝试了很多搜索,但无法获得线索。帮助将不胜感激。

【问题讨论】:

  • 您将使用 Perl 或 Python 更快地获得工作代码。 C 不是解析字符串的最佳语言。这当然是可能的,但它需要 C 知识。
  • @mvp 是一个更大项目的一部分。必须使用 C :(
  • while(!feof(file)) is wrong.
  • 请勿发文字图片

标签: c pointers segmentation-fault string.h


【解决方案1】:

您可以使用while(fgets(line,512,file)) 而不是while(!feof(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;
}

【讨论】:

  • 谢谢!你也知道我可以如何进一步完善搜索吗?要匹配所需的输出?
  • @HadiZia 我添加了更多代码以获得预期的输出,希望这对您有所帮助。
  • 伙计,我尝试编译代码,但出现以下错误,我不知道出了什么问题。请帮助 :( 错误:#endif without #if #endif // MSC ^ test.c:30:27:警告:函数 '_strdup' 的隐式声明在 C99 [-Wimplicit-function-declaration] 中无效 [-Wimplicit-function-declaration] char *title = _strdup(search); ^ test.c:30:19: 警告:不兼容的整数到指针转换初始化 'char *' 使用类型为 'int' [-Wint-conversion] char *title = _strdup(search); ^ ~~~~~~~~~~~~~~~~~~
  • 您使用的是 c99,因此请删除 #ifndef(代码中的前 3 行),将 _strdup 替换为 strdup。让我知道这是否适合您。
  • English_Wikipedia Internet encyclopedia Wikimedia Foundation Jimmy Wales protected page Creative Commons Attribution/ English-language the most Articles of any editions 5,730,076 Simple English Wikipedia Wikipedia:里程碑争议解决 Dutch Wikipedia Wikimedia Commons Wikimedia Foundation native language Arbitration委员会 Jimmy Wales 仲裁员 德国维基百科 维基百科批评 维基百科 Seigenthaler 传记事件 分割错误:11 好的,所以它给出了一些输出!!!!但最终导致分段错误:(
【解决方案2】:
size_t sz;
fseek(file, 0L , SEEK_END);
sz=ftell(file);
rewind(file);
char line[sz+1];

这可能会修复分段错误。

【讨论】:

  • @Mayur 是的,它修复了 seg 错误,开始打印一些与模式不匹配的额外链接。但它仍然打印
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 2015-09-22
  • 1970-01-01
  • 2013-08-28
相关资源
最近更新 更多