Подтвердить что ты не робот

Разбор HTML на iPhone

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

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

4b9b3361

Ответ 1

Похоже, libxml2.2 входит в SDK, а libxml/HTMLparser.h утверждает следующее:

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

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

Ответ 2

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

Требования

-Add libxml2 включает в ваш проект

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

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

  • Проект меню- > Изменить настройки проекта
  • Поиск настроек "Другие флаги компоновщика"
  • Добавить новый флаг поиска "-lxml2"

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

  • TFpple.h
  • TFpple.m
  • TFppleElement.h
  • TFppleElement.m
  • XPathQuery.h
  • XPathQuery.m

- Пройдитесь по w3school XPath Tutorial, чтобы чувствовать себя комфортно с языком 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.

Ответ 3

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

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

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

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

Если вы делаете много разбора, это порочная утечка. Теперь... как мне вернуть свою ночь: -)

Ответ 4

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

Objective-C-HMTL-Parser

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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