Парсинг HTML на iPhone

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

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

Мне нравится легкая обертка Бена Ривза, о которой он упоминал в этой ветке. Обертка переехала на github: Objective-C-HMTL-Parser

yarchiko 30.07.2012 13:06

Как этот вопрос «неконструктивный»?

735Tesla 29.03.2014 16:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
69
2
73 769
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Это, вероятно, зависит от того, насколько запутан 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

smdvlpr 09.03.2011 00:00

ElementParser содержит множество ошибок и не обновляется с 2009 года. Я настоятельно не рекомендую его использовать.

steipete 27.03.2011 16:57

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

Требования:

-Добавить libxml2 в ваш проект

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

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

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

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

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

-Пройдитесь по 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.

Я использовал это только сейчас, и до сих пор он работал очень хорошо.

Karsten Silz 11.03.2010 10:57

Он отлично работает со строковыми данными. Подскажите, пожалуйста, как мне получить и показать изображение из html?

Akshay 12.07.2011 10:37

Асхай, изображения не хранятся в HTML. Вы должны получить URL-адрес и загрузить его самостоятельно. Вы можете использовать [NSData dataWithContentsOfURL], чтобы получить файл, когда у вас есть URL.

Maciej Swic 25.07.2011 17:11

С 8 июля 2011 г. метод search: из TFHpple был переименован в searchWithXPathQuery: См. https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c‌ 6f2060acfcdfb2d3a13a‌ 3

Protocole 06.05.2012 18:57

У меня это очень хорошо сработало, спасибо. У меня есть странная причуда, когда к именам файлов, кажется, добавлен пробел, но это может происходить из-за ошибки кодирования и не имеет ничего общего с hpple.

Robert 05.11.2012 19:10

Можно ли добавлять / удалять элементы с помощью Hpple?

Valerio Santinelli 13.02.2013 20:53

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

Objective-C-HMTL-Parser

Отлично выглядит Бен. Возможно, я буду использовать его в своем следующем приложении для iPad.

Brock Woolf 12.08.2010 12:21

Сайт не работает, разместите это на GitHub!

bentford 10.04.2012 02:27

Бен, я пытался добавить твою библиотеку - это тоже для разработки для iphone? так как я получаю stackoverflow.com/questions/14086354/…

Dejell 30.12.2012 02:11

Как насчет использования компонента 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»?

Maciej Swic 26.07.2011 04:17
github.com/topfunky/hpple - Да, думаю, он довольно старый. Работает нормально, как только вы устраните утечку.
DavidAWalsh 26.07.2011 14:27

Похоже, это исправление было обновлено в последней фиксации

jfisk 09.01.2012 08:46

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

Это не отвечает на вопрос - он ищет клиентскую библиотеку.

Freney 26.10.2012 16:02

Другие вопросы по теме