разбор HTML на iPhone [закрыто]
может ли кто-нибудь порекомендовать библиотеку C или Objective-C для синтаксического анализа HTML? Он должен обрабатывать грязный HTML-код, который не будет полностью проверять.
существует ли такая библиотека, или мне лучше просто пытаться использовать регулярные выражения?
9 ответов:
С hpple довольно полезно для разбора грязный HTML. Проект Hpple-это оболочка Objective-C в библиотеке XPathQuery для синтаксического анализа HTML. С его помощью вы можете отправить запрос XPath и получить результат .
требования:
- добавить libxml2 включает в свой проект
- Меню Проект - > Изменить Настройки Проекта
- поиск для установки "пути поиска заголовка"
- Добавить новый путь поиска "${SDKROOT} / usr / include/libxml2"
- включить рекурсивный вариант
- добавить библиотеку libxml2 в свой проект
- Меню Проект - > Изменить Настройки Проекта
- Поиск настройки "другие флаги компоновщика"
- Добавить новый флаг поиска" - lxml2"
С hpple получить следующие файлы исходного кода и добавить их в свой проект:
- TFpple.h
- TFpple.м
- TFppleElement.h
- TFppleElement.м
- XPathQuery.h
- 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];
известные проблемы
As hpple-это оболочка над XPathQuery, которая еще одна обертка, этот вариант, вероятно, не самый эффективный. Если производительность является проблемой в вашем проекте, я рекомендую закодировать свое собственное легкое решение на основе кода библиотеки hpple и xpathquery.
выглядит так:
libxml2.2
входит в SDK, иlibxml/HTMLparser.h
требования следующие:этот модуль реализует HTML 4.0 не проверяющий парсер с API, совместимым с XML-парсером. Он должен уметь разбирать" реальный мир " HTML, даже если сильно нарушен с точки зрения спецификации.
это звучит как то, что мне нужно, так что я, вероятно, буду использовать это.
на всякий случай, если кто-то попал сюда, погуглив для хорошего парсера XPath и ушел и использовал TFHpple, обратите внимание, что TFHpple использует XPathQuery. Это очень хорошо, но есть утечка памяти.
в функции * PerformXPathQuery, если узлы найдены равными нулю, он выскакивает перед очисткой.
Итак, где вы видите этот бит кода: добавьте в две строки очистки.
xmlNodeSetPtr nodes = xpathObj->nodesetval; if (!nodes) { NSLog(@"Nodes was nil."); /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); return nil; }
Если вы делаете много разбора,это порочная утечка. Сейчас.... как я могу получить моя ночь :-)
Это, вероятно, зависит от того, насколько грязный HTML и что вы хотите извлечь. Но обычно порядок делает довольно хорошую работу. Это написано в 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 искажен (отсутствуют закрывающие теги), это может не очень помочь.