Разбор информации URL из тегов HTML <a></a> в C - PullRequest
0 голосов
/ 02 декабря 2010

Мое приложение получает как часть своих данных большой файл в формате html, который содержит большое количество ссылок. Что-то вроде того, что вы получите, если будете искать что-либо в Google, Yahoo или других поисковых системах: список URL-адресов и описание или другой текст.

Я пытался предложить функцию, которая может анализировать URL и описание и сохранять их в текстовом файле, но это оказалось трудным, по крайней мере для меня. Итак, если у меня есть:

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

Я бы проанализировал http://www.w3schools.com и Visit W3Schools и сохранил бы их в файл.

Есть ли способ достичь этого? в простой C?
Любая помощь приветствуется.

1 Ответ

1 голос
/ 02 декабря 2010

Вам действительно нужен правильный 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 обновляется, чтобы выйти за пределы проанализированных данных (это параметр in-out), и что переданная строка изменяется. Я чувствую себя ленивым / слишком занятым, чтобы делать полные решения с выделенными памятью возвращаемыми строками.

Кроме того, вам, вероятно, следует возвращать ошибки в каскаде фигурных скобок (кроме первого), отчасти поэтому я их так сложил. Существуют и другие более аккуратные решения, которые можно адаптировать, чтобы они были более общими.

Таким образом, в основном, вы затем вызываете функцию несколько раз, пока она не возвращает false.

...