Каков наилучший подход для разбора XML / «очистки экрана» в iOS? UIWebview или NSXMLParser? - PullRequest
8 голосов
/ 22 августа 2010

Я создаю приложение для iOS, которому нужно получить данные с веб-страницы.Сначала я использовал NSXMLParser initWithContentsOfURL: и проанализировал HTML с делегатом NSXMLParser.Однако кажется, что такой подход может быстро стать болезненным (если, например, HTML-код изменился, мне пришлось бы переписать код синтаксического анализа, что может быть неудобно).

Видя, что я загружаю веб-страницу, я тоже взглянул на UIWebView.Похоже, UIWebView может быть путь.stringByEvaluatingJavaScriptFromString: кажется очень удобным способом извлечения данных и позволит хранить javascript в отдельном файле, который будет легко редактировать при изменении HTML.Тем не менее, использование UIWebView кажется немного хакерским (поскольку UIWebView является подклассом UIView, оно может блокировать основной поток, а в документах говорится, что ограничение JavaScript составляет 10 МБ).

у кого-нибудь есть совет относительно разбора XML / HTML, прежде чем я застряну?

ОБНОВЛЕНИЕ:

Я написал сообщение в блоге о своем решении: Разбор HTML /соскоб экрана в iOS

Ответы [ 2 ]

10 голосов
/ 22 апреля 2011

Я делал это несколько раз. Лучший подход, который я нашел, это использовать libxml2, который имеет режим для HTML. Затем вы можете использовать XPath для запроса документа.

Работа с libxml2 API не самая приятная. Поэтому я обычно приношу файлы XPathQuery.h / .m, описанные на этой странице:

http://cocoawithlove.com/2008/10/using-libxml2-for-parsing-and-xpath.html

Затем я выбираю данные, используя NSConnection, и запрашиваю данные примерно так:

NSArray *tdNodes = PerformHTMLXPathQuery(self.receivedData, @"//td[@class='col-name']/a/span");

Резюме:

  1. Добавьте libxml2 в ваш проект, вот несколько быстрых инструкций для XCode4: http://cmar.me/2011/04/20/adding-libxml2-to-an-xcode-4-project/

  2. Получить XPathQuery.h / .m

  3. Используйте оператор XPath для запроса html-документа.

6 голосов
/ 22 августа 2010

Синтаксический анализ HTML с помощью синтаксического анализатора XML обычно не работает в любом случае, поскольку многие сайты имеют неправильный HTML, с которым будет работать веб-браузер, но строгий синтаксический анализатор XML, такой как NSXMLParser, полностью не будет работать.

Для многих языков сценариев существуют большие библиотеки, которые более милосердны. Как и в модуле «Красивый суп» в Python. К сожалению, я не знаю таких модулей для Objective-C.

Загрузка материала в UIWebView может быть самым простым способом. Обратите внимание, что вам не нужно выводить UIWebView на экран. Вы можете создать отдельный UIWindow и добавить к нему UIWebView, чтобы выполнить полный вывод за пределы экрана. Я думаю, что было видео WWDC2009 об этом. Как вы уже упоминали, он не будет легким.

В зависимости от данных, которые вы хотите, и сложности страниц, которые вам нужно проанализировать, вы также можете анализировать их с помощью регулярных выражений или даже парсера, написанного от руки. Я делал это много раз, и для простых данных это хорошо работает.

...