2010-12-02 80 views
1

继我的previous question我一直试图解析HTML文件中的href字符串,以便将该字符串发送到我以前的问题的解决方案。计数并解析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>

任何帮助表示赞赏。

+3

“它不起作用”对您的程序不是很有帮助的描述。它通过编译器吗?它是否提供任何输出? – 2010-12-02 20:35:18

+0

不,它简单地得到它在'缓冲区'找到的任何随机字符串,而不是'' – Jessica 2010-12-02 20:39:56

回答

0

这并没有真正回答你关于此代码的疑问,但使用C库来完成此操作可能更可靠,例如HTMLParser from libxml2

HTML解析看起来很简单,但有些边缘情况使得使用已知工作的东西比单独工作更容易。

+0

之间的内容谢谢,但我不想使用外部库来做这样的事情。 – Jessica 2010-12-02 20:41:12

1

这段代码有很多错误。

  • 您每循环一次只能开始递增一次。这意味着你一遍又一遍地找到相同的href。我想你的意思是将begin移至end之后?

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

  • 为什么你分配1000个字符,只使用100?

  • 您搜索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 

对于空间的分配,我觉得你应该保持的值strstr结果的 “href = \””(这个start,然后你需要的尺寸是end - start(终止NUL为+1)。分配那么多空间,强化它,添加NUL和Robert的父母的兄弟姐妹。

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