【问题标题】:Parsing the information of a URL out of a HTML <a></a> tags in C从 C 中的 HTML <a></a> 标签中解析出 URL 的信息
【发布时间】:2010-12-02 15:50:56
【问题描述】:

我的应用程序将一个包含大量链接的大型 html 格式文件作为其数据的一部分。类似于在 Google、Yahoo 或其他搜索引擎上搜索任何内容时会得到的结果:URL 列表和描述或其他文本。

我一直在尝试开发一个可以解析 URL 和描述并将它们保存到文本文件中的函数,但事实证明这很难,至少对我来说是这样。所以,如果我有:

&lt;a href="http://www.w3schools.com"&gt;Visit W3Schools&lt;/a&gt;

我会解析http://www.w3schools.comVisit W3Schools 并将它们保存在一个文件中。

有什么方法可以做到这一点?用纯 C 语言?
任何帮助表示赞赏。

【问题讨论】:

  • 如果 HTML 真的只是 &lt;a href...&gt;...&lt;/a&gt;,那么您可以使用 XSL。否则,您将需要一个完整的 HTML 解析器。甚至可能是一个 shell 脚本 + Lynx(基于文本的浏览器)+ awk。如果这是一次性任务,那么我会在编辑器中搜索/替换。 (再次假设 XHTML 格式正确。)
  • 这只是一个简单的html文件。 就是这样。现在,我不想使用库或外部 html 解析器。我只想读取文件并解析出 URL 和描述。
  • 证明它对你来说很难的主要原因是你试图在 C 中完成它。C 真的,真的,真的不是为这种任务而构建的。较新的语言为字符串操作提供了更复杂的工具。 C 甚至没有内置真正的文本类型。当你使用 char* 和 char[N] 时,你就是在伪造它。

标签: c parsing text


【解决方案1】:

你确实需要一个合适的 html 解析器,但是对于一些又快又脏的东西,试试:

bool get_url(char **data, char **url, char **desc)
{
  bool result = false;
  char *ptr = strstr(*data, "<a");

  if(NULL != ptr)
  {
    *data = ptr + 2;

    ptr = strstr(*data, "href=\"");
    if(NULL != ptr)
    {
      *data = ptr + 6;
      *url = *data;

      ptr = strchr(*data, '"');
      if(NULL != ptr)
      {
        *ptr = '\0';
        *data = ptr + 1;

        ptr = strchr(*data, '>');
        if(NULL != ptr)
        {
          *data = ptr + 1;
          *desc = *data;

          ptr = strstr(*data, "</a>");
          if(NULL != ptr)
          {
            *ptr = '\0';
            *data = ptr + 4;
            result = true;
          }
        }
      }
    }
  }

  return result;
}

并不是data 被更新为超出解析的数据(它是一个输入输出参数)并且传入的字符串被修改。我感到懒惰/太忙,无法使用分配的内存返回字符串来完成完整的解决方案。

此外,您可能应该在紧接范围大括号(第一个除外)的级联上返回错误,这也是我将它们堆叠起来的部分原因。还有其他更简洁的解决方案可以调整为更通用。

所以基本上你然后重复调用该函数直到它返回 false。

【讨论】:

  • 酷,我只需要计算 char* 的最大大小就可以了。谢谢你的帮助!
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2011-05-23
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多