синтаксический анализ HTML на iPhone [закрыто]

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

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

9 ответов


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

требования:

- добавить libxml2 включает в свой проект

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

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

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

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

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

-прогуляемся по 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.


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

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

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


на всякий случай, если кто-то попал сюда, googling для хорошего парсера 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-Parser


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


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


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


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


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