parsingr HTML sur l’iPhone

Quelqu’un peut-il recommander une bibliothèque C ou Objective-C pour l’parsing HTML? Il doit gérer du code HTML désordonné qui ne validera pas tout à fait.

Existe-t-il une telle bibliothèque ou est-il préférable d’essayer d’utiliser des expressions régulières?

J’ai trouvé que l’utilisation d’ Hpple était très utile pour parsingr le HTML en désordre. Le projet Hpple est un wrapper Objective-C sur la bibliothèque XPathQuery pour parsingr le HTML. En l’utilisant, vous pouvez envoyer une requête XPath et recevoir le résultat.

Exigences :

-Add libxml2 inclut dans votre projet

  1. Menu Projet-> Modifier les parameters du projet
  2. Rechercher le paramètre “Chemins de recherche d’en-tête”
  3. Ajouter un nouveau chemin de recherche “$ {SDKROOT} / usr / include / libxml2”
  4. Activer l’option récursive

-Ajouter la bibliothèque libxml2 à votre projet

  1. Menu Projet-> Modifier les parameters du projet
  2. Rechercher le réglage “Autres indicateurs de liaison”
  3. Ajouter un nouvel indicateur de recherche “-lxml2”

-De Hpple, obtenez les fichiers de code source suivants et ajoutez-les à votre projet:

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

-Passez une promenade sur le tutoriel XPath de w3school pour vous familiariser avec le langage XPath.

Exemple de code

#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 NSSsortingng *content = [element content]; [xpathParser release]; [data release]; 

Problèmes connus

Comme hpple est un wrapper sur XPathQuery qui est un autre wrapper, cette option n’est probablement pas la plus efficace. Si les performances posent problème dans votre projet, je vous recommande de coder votre propre solution légère basée sur le code de la bibliothèque hpple et xpathquery.

On dirait que libxml2.2 est dans le SDK et que libxml/HTMLparser.h revendique ce qui suit:

Ce module implémente un parsingur non vérificateur HTML 4.0 avec une API compatible avec les parsingurs syntaxiques XML. Il devrait être capable d’parsingr le “vrai monde” HTML, même s’il est gravement rompu du sharepoint vue des spécifications.

Cela ressemble à ce dont j’ai besoin, alors je vais probablement l’utiliser.

Juste au cas où quelqu’un serait venu ici pour goûter un agréable parsingur XPath et utiliser TFHpple, notez que TFHpple utilise XPathQuery. C’est plutôt bien, mais il y a une fuite de mémoire.

Dans la fonction * PerformXPathQuery, si les nœuds sont nuls, il saute avant de nettoyer.

Donc, où vous voyez ce bit de code: ajoutez les deux lignes de nettoyage.

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

Si vous faites beaucoup d’parsing, c’est une fuite vicieuse. Maintenant …. comment puis-je récupérer ma nuit 🙂

J’ai écrit un wrapper léger autour de libxml qui peut être utile:

Objective-C-HMTL-Parser

Cela dépend probablement du niveau de désordre du HTML et de ce que vous voulez extraire. Mais d’habitude, Tidy fait du bon travail. Il est écrit en C et je suppose que vous devriez pouvoir le construire et le relier de manière statique à l’iPhone. Vous pouvez facilement installer la version en ligne de commande et tester d’abord les résultats.

Vous voudrez peut-être vérifier ElementParser. Il fournit une parsing “juste suffisante” du HTML et du XML. De belles interfaces facilitent la circulation des documents XML / HTML. http://touchtank.wordpress.com/

Pourquoi ne pas utiliser le composant Webkit et éventuellement des packages tiers tels que jquery pour des tâches telles que celles-ci? Ne serait-il pas possible de récupérer les données HTML dans un composant invisible et de tirer parti des sélecteurs très matures des frameworks javascript?

L’API GData Objective-C de Google réimplémente NSXMLElement et les autres classes associées que Apple a supprimées du SDK iPhone. Vous pouvez le trouver ici http://code.google.com/p/gdata-objectivec-client/ . Je l’ai utilisé pour traiter des messages via Jabber. Bien sûr, si votre HTML est mal formé (balises de fermeture manquantes), cela pourrait ne pas être très utile.

Nous utilisons Convertigo pour parsingr le HTML côté serveur et renvoyer des services Web JSON propres et propres à nos applications mobiles.