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

时间:2010-12-02 20:33:37

标签: c parsing

关注我的previous question我一直试图从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;
}

基本上我需要将href的信息提取到字符串中,例如:

<a href="http://www.w3schools.com">Visit W3Schools</a>

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

这段代码有很多问题。

  • 每次循环开始时,每次只增加1。这意味着您反复找到相同的href。我想你的意思是将begin移到end之后?

  • strncpy通常会复制100个字符(因为HTML会更长),所以不会终止字符串。你想要url[100] ='\ 0'某处

  • 为什么要分配1000个字符并仅使用100个字符?

  • 您从begin开始搜索end。这意味着如果在href =“”之前有一个,你会发现它。

  • 您不能使用end

  • 为什么不在网址末尾搜索终止引用?

考虑到上述问题(并添加了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

对于空间分配,我认为你应该保留“href = \”的strstr结果(调用此start然后你需要的大小是end - start(+1代表终止NUL)。分配那么大的空间,将它跨过,添加NUL和Robert是你父母的男性兄弟。

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

答案 1 :(得分:0)

这并不能真正回答您对此代码的质疑,但使用C库执行此操作可能更为可靠,例如HTMLParser from libxml2

HTML解析看起来很简单,但是有一些边缘情况可以让你更容易使用已知工作的东西而不是自己处理它们。