Может ли кто-нибудь порекомендовать библиотеку C или Objective-C для разбора HTML? Он должен обрабатывать беспорядочный HTML-код, который не совсем проверяется.
Существует ли такая библиотека, или мне лучше просто попытаться использовать регулярные выражения?
Как этот вопрос «неконструктивный»?





Это, вероятно, зависит от того, насколько запутан HTML и что вы хотите извлечь. Но обычно Аккуратный неплохо справляется. Он написан на C, и я думаю, вы сможете собрать и статически связать его для iPhone. Вы можете легко установить версию для командной строки и сначала протестировать результаты.
Похоже, libxml2.2 входит в SDK, а libxml/HTMLparser.h утверждает следующее:
This module implements an HTML 4.0 non-verifying parser with API compatible with the XML parser ones. It should be able to parse "real world" HTML, even if severely broken from a specification point of view.
Похоже, это то, что мне нужно, так что я, вероятно, воспользуюсь этим.
API Google GData Objective-C повторно реализует NSXMLElement и другие связанные классы, которые Apple удалила из iPhone SDK. Вы можете найти его здесь http://code.google.com/p/gdata-objectivec-client/. Я использовал его для обмена сообщениями через Jabber. Конечно, если ваш HTML имеет неправильный формат (отсутствуют закрывающие теги), это может не сильно помочь.
Вы можете проверить ElementParser. Он обеспечивает «ровно столько» синтаксического анализа HTML и XML. Хорошие интерфейсы делают работу с документами XML / HTML очень простой. http://touchtank.wordpress.com/
Новая ссылка: github.com/Objective3/ElementParser
ElementParser содержит множество ошибок и не обновляется с 2009 года. Я настоятельно не рекомендую его использовать.
Я обнаружил, что использование болтать весьма полезно для анализа запутанного HTML. Проект Hpple - это оболочка Objective-C в библиотеке XPathQuery для синтаксического анализа HTML. С его помощью вы можете отправить запрос XPath и получить результат.
Требования:
-Добавить libxml2 в ваш проект
-Добавить библиотеку libxml2 в свой проект
-Из болтать получите следующие файлы исходного кода и добавьте их в свой проект:
-Пройдитесь по 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.
Я использовал это только сейчас, и до сих пор он работал очень хорошо.
Он отлично работает со строковыми данными. Подскажите, пожалуйста, как мне получить и показать изображение из html?
Асхай, изображения не хранятся в HTML. Вы должны получить URL-адрес и загрузить его самостоятельно. Вы можете использовать [NSData dataWithContentsOfURL], чтобы получить файл, когда у вас есть URL.
С 8 июля 2011 г. метод search: из TFHpple был переименован в searchWithXPathQuery: См. https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c 6f2060acfcdfb2d3a13a 3
У меня это очень хорошо сработало, спасибо. У меня есть странная причуда, когда к именам файлов, кажется, добавлен пробел, но это может происходить из-за ошибки кодирования и не имеет ничего общего с hpple.
Можно ли добавлять / удалять элементы с помощью Hpple?
Я написал легкую оболочку для libxml, которая может быть полезна:
Отлично выглядит Бен. Возможно, я буду использовать его в своем следующем приложении для iPad.
Сайт не работает, разместите это на GitHub!
Бен, я пытался добавить твою библиотеку - это тоже для разработки для iphone? так как я получаю stackoverflow.com/questions/14086354/…
Как насчет использования компонента Webkit и, возможно, сторонних пакетов, таких как jquery, для таких задач? Разве нельзя было бы получить данные html в невидимом компоненте и воспользоваться преимуществами очень зрелых селекторов фреймворков javascript?
На всякий случай, если кто-то попал сюда, поискав в Google хороший синтаксический анализатор XPath, и ушел и использовал TFHpple, обратите внимание, что TFHpple использует XPathQuery. Это неплохо, но имеет утечку памяти.
В функции * PerformXPathQuery, если обнаруживается, что узлы равны нулю, она выскакивает перед очисткой.
Итак, где вы видите этот фрагмент кода: Добавьте две строки очистки.
xmlNodeSetPtr nodes = xpathObj->nodesetval;
if (!nodes)
{
NSLog(@"Nodes was nil.");
/* Cleanup */
xmlXPathFreeObject(xpathObj);
xmlXPathFreeContext(xpathCtx);
return nil;
}
Если вы делаете МНОГО синтаксического анализа, это ужасная утечка. Теперь .... как мне вернуть мою ночь :-)
Я могу найти только Hpple, который не обновлялся с 2009 года. Где мне найти этот «TFHpple»?
Похоже, это исправление было обновлено в последней фиксации
Мы используем Convertigo для синтаксического анализа HTML на стороне сервера и возврата чистых и аккуратных веб-сервисов JSON в наши мобильные приложения.
Это не отвечает на вопрос - он ищет клиентскую библиотеку.
Мне нравится легкая обертка Бена Ривза, о которой он упоминал в этой ветке. Обертка переехала на github: Objective-C-HMTL-Parser