Вопрос

Кто-нибудь может порекомендовать библиотеку C или Objective-C для синтаксического анализа HTML?Ему нужно обрабатывать беспорядочный HTML-код, который не будет полностью валидирован.

Существует ли такая библиотека, или мне лучше просто попытаться использовать регулярные выражения?

Это было полезно?

Решение 2

Выглядит как libxml2.2 поставляется в SDK, и libxml/HTMLparser.h утверждает следующее:

Этот модуль реализует анализатор без проверки HTML 4.0 с API, совместимым с анализаторами XML.Он должен быть способен анализировать HTML-код "реального мира", даже если он сильно нарушен с точки зрения спецификации.

Это похоже на то, что мне нужно, так что я, вероятно, собираюсь это использовать.

Другие советы

Я нашел применение гэс довольно полезно для разбора беспорядочного HTML.Проект Hpple - это оболочка Objective-C для библиотеки XPathQuery для синтаксического анализа HTML.С его помощью вы можете отправить запрос XPath и получить результат .

Требования:

-Добавьте компоненты libxml2 в свой проект

  1. Меню Проект-> Изменить настройки проекта
  2. Выполните поиск для настройки "Пути поиска по заголовку"
  3. Добавьте новый путь поиска "${SDKROOT}/usr/include/libxml2".
  4. Включить рекурсивную опцию

-Добавьте библиотеку libxml2 в свой проект

  1. Меню Проект-> Изменить настройки проекта
  2. Выполните поиск для установки "Других флагов компоновщика".
  3. Добавьте новый флаг поиска "-lxml2".

-Из гэс получите следующие файлы исходного кода и добавьте их в свой проект:

  1. TFpple.h
  2. TFpple.m
  3. TFppleElement.h
  4. TFppleElement.m
  5. XPathQuery.h
  6. XPathQuery.m

-Прогуляйся по учебное пособие по w3school XPath чувствовать себя комфортно с языком XPath.

Пример кода

#import "TFHpple.h"

NSData *data = [[NSData alloc] initWithContentsOfFile:@"example.html"];

// Create parser
xpathParser = [[TFHpple alloc] initWithHTMLData:data];

//Get all the cells of the 2nd row of the 3rd table 
NSArray *elements  = [xpathParser searchWithXPathQuery:@"//table[3]/tr[2]/td"];

// Access the first cell
TFHppleElement *element = [elements objectAtIndex:0];

// Get the text within the cell tag
NSString *content = [element content];  

[xpathParser release];
[data release];

Известные проблемы

Поскольку hpple является оболочкой поверх XPathQuery, который является другой оболочкой, этот вариант, вероятно, не самый эффективный.Если в вашем проекте проблема с производительностью, я рекомендую создать собственное облегченное решение на основе кода библиотеки hpple и xpathquery.

На всякий случай, если кто-нибудь добрался сюда, поискав в Google хороший парсер XPath, и отключился, и использовал TFHpple, обратите внимание, что TFHpple использует XPathQuery.Это довольно хорошо, но имеет место утечка памяти.

В функции *PerformXPathQuery, если обнаруживается, что узлы равны нулю, она выскакивает перед очисткой.

Итак, где вы видите этот фрагмент кода:Добавьте две строки очистки.

  xmlNodeSetPtr nodes = xpathObj->nodesetval;
  if (!nodes)
    {
      NSLog(@"Nodes was nil.");
        /* Cleanup */
        xmlXPathFreeObject(xpathObj);
        xmlXPathFreeContext(xpathCtx);
      return nil;
    }

Если вы проводите МНОГО синтаксического анализа, это серьезная утечка.Сейчас же....как мне вернуть себе мой вечер :-)

Я написал облегченную оболочку вокруг libxml, которая может быть полезной:

Objective-C-HMTL-Анализатор

Вероятно, это зависит от того, насколько запутан HTML-код и что вы хотите извлечь.Но обычно Аккуратный делает довольно хорошую работу.Он написан на C, и я думаю, вы должны быть в состоянии создать и статически связать его для iPhone.Вы можете легко установить версию командной строки и сначала протестировать результаты.

Возможно, вы захотите ознакомиться с ElementParser .Он обеспечивает "достаточный" синтаксический анализ HTML и XML.Приятные интерфейсы делают работу с XML / HTML-документами очень простой. http://touchtank.wordpress.com/

Как насчет использования компонента Webkit и, возможно, сторонних пакетов, таких как jquery, для подобных задач?Разве не было бы возможно извлечь html-данные из невидимого компонента и воспользоваться преимуществами очень зрелых селекторов фреймворков javascript?

GData Objective-C API от Google переопределяет NSXMLElement и другие связанные классы, которые Apple удалила из iPhone SDK.Вы можете найти его здесь http://code.google.com/p/gdata-objectivec-client/.Я использовал его для обмена сообщениями через Jabber.Конечно, если ваш HTML-код искажен (отсутствуют закрывающие теги), это может не сильно помочь.

Мы используем Convertigo для синтаксического анализа HTML на стороне сервера и возврата чистых веб-сервисов JSON в наши мобильные приложения

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top