C 计算并解析html文件中的所有href链接

C 计算并解析html文件中的所有href链接,c,parsing,C,Parsing,在我的问题之后,我一直在尝试解析html文件中的href字符串,以便将该字符串发送到我前面问题的解决方案中 这就是我所拥有的,但它不起作用 void ParseUrls(char* Buffer) { char *begin = Buffer; char *end = NULL; int total = 0; while(strstr(begin, "href=\"") != NULL) { end = strstr(begin,

在我的问题之后,我一直在尝试解析html文件中的href字符串,以便将该字符串发送到我前面问题的解决方案中

这就是我所拥有的,但它不起作用

void ParseUrls(char* Buffer)
{
    char *begin = Buffer;
    char *end = NULL;
    int total = 0;

    while(strstr(begin, "href=\"") != NULL)
    {   
        end = strstr(begin, "</a>");
        if(end != NULL)
        {
            char *url = (char*) malloc (1000 * sizeof(char));

            strncpy(url, begin, 100);
            printf("URL = %s\n", url);

            if(url) free(url);
        }

        total++;
        begin++;
    }

    printf("Total URLs = %d\n", total);
    return;
}
void解析URL(字符*缓冲区)
{
char*begin=Buffer;
char*end=NULL;
int-total=0;
while(strstr(begin,“href=\”)!=NULL)
{   
结束=strstr(开始“”;
如果(结束!=NULL)
{
char*url=(char*)malloc(1000*sizeof(char));
strncpy(url,begin,100);
printf(“URL=%s\n”,URL);
如果(url)免费(url);
}
总计++;
begin++;
}
printf(“总URL=%d\n”,总计);
返回;
}
基本上,我需要将href的信息提取到字符串中,类似于:


非常感谢您的帮助。

这并不能真正回答您关于此代码的问题,但使用C库来完成此操作可能更可靠,例如


HTML解析看起来很容易,但有些边缘情况使使用已知有效的东西比自己使用它们更容易。

这并不能真正回答您关于这段代码的问题,但使用C库来实现这一点可能更可靠,例如


HTML解析看起来很简单,但有些边缘情况使使用已知有效的东西比自己使用它们更容易。

这段代码有很多错误

  • 在循环中,每次只能增加一个开始。这意味着您会一次又一次地找到相同的href。我想您是想将
    开始
    移动到
    结束
    之后

  • strncpy通常会复制100个字符(因为HTML会更长),因此不会nul终止字符串。您希望
    url[100]
    ='\0'在某个地方

  • 为什么分配1000个字符而只使用100个

  • 您搜索以begin开头的
    end
    。这意味着如果href=”“前面有一个,您将找到它

  • 你不能用
    end
    做任何事情

  • 为什么不在URL的末尾搜索终止引用

考虑到上述问题(并添加URL的终止),它对我来说还可以

给定

"<a href=\"/email_services.php\">Email services</a> "
“”
它打印

URL = <a href="/email_services.php">Email services</a> 
URL = a href="/email_services.php">Email services</a> 
URL =  href="/email_services.php">Email services</a> 
URL = href="/email_services.php">Email services</a> 
Total URLs = 4
URL=
URL=a href=“/email\u services.php”>电子邮件服务
URL=href=“/email\u services.php”>电子邮件服务
URL=href=“/email\u services.php”>电子邮件服务
URL总数=4
对于空间的分配,我认为您应该保留strstr的结果“href=\”(称之为
start
,然后您需要的大小是
end-start
(+1表示终止NUL)。分配那么多空间,strncp将NUL和您父母的兄弟姐妹Robert加在一起


另外,请记住href=不是锚的唯一标记。它也可以出现在其他一些标记中。

此代码有很多错误

  • 在循环中,每次只能增加一个开始。这意味着您会一次又一次地找到相同的href。我想您是想将
    开始
    移动到
    结束
    之后

  • strncpy通常会复制100个字符(因为HTML会更长),因此不会nul终止字符串。您希望
    url[100]
    ='\0'在某个地方

  • 为什么分配1000个字符而只使用100个

  • 您搜索以begin开头的
    end
    。这意味着如果href=”“前面有一个,您将找到它

  • 你不能用
    end
    做任何事情

  • 为什么不在URL的末尾搜索终止引用

考虑到上述问题(并添加URL的终止),它对我来说还可以

给定

"<a href=\"/email_services.php\">Email services</a> "
“”
它打印

URL = <a href="/email_services.php">Email services</a> 
URL = a href="/email_services.php">Email services</a> 
URL =  href="/email_services.php">Email services</a> 
URL = href="/email_services.php">Email services</a> 
Total URLs = 4
URL=
URL=a href=“/email\u services.php”>电子邮件服务
URL=href=“/email\u services.php”>电子邮件服务
URL=href=“/email\u services.php”>电子邮件服务
URL总数=4
对于空间的分配,我认为您应该保留strstr的结果“href=\”(称之为
start
,然后您需要的大小是
end-start
(+1表示终止NUL)。分配那么多空间,strncp将NUL和您父母的兄弟姐妹Robert加在一起


另外,请记住href=不是锚的唯一标记。它也可以出现在其他一些标记中。

“它不工作”对您的程序不是很有帮助的描述。它是否通过编译器?它是否提供任何输出?不,它只获取它在
缓冲区中找到的任何随机字符串,而不是
之间的字符串。它不工作"对你的程序不是很有帮助的描述。它通过编译器了吗?它有输出吗?不,它只得到它在
缓冲区中找到的任意随机字符串,而不是中间的字符串
谢谢,但我不想用外部库来做这样的事情。谢谢,但我不想用外部库来做像这样的东西。保罗,谢谢你的指点。我用100只是为了测试,因为我得到了各种各样的东西,我只是想检查前100个字符。在任何情况下,我都是分配1024的url。你有没有一个可能帮助我做这件事的片段?好的,你介意解释一下我如何修复我发布的代码吗假设这是一个学习练习,我认为如果你仍然无法破解你的问题,你应该尝试更新你的问题。要给你一个示例文件来使用:只需谷歌一些东西,搜索后从谷歌提取html源代码并将其提供给函数是的,我就是这么做的。你应该这样做:)保罗,谢谢你的指点。我用100只是为了测试,因为我得到了所有的东西,我只想检查前100个字符。无论如何,我是