web-dev-qa-db-fra.com

analyser HTML sur l'iPhone

Quelqu'un peut-il recommander une bibliothèque C ou Objective-C pour l'analyse HTML? Il doit gérer du code HTML en désordre qui ne sera pas tout à fait validé.

Existe-t-il une telle bibliothèque, ou suis-je mieux d'essayer simplement d'utiliser des expressions régulières?

68
Sophie Alpert

Ressemble à libxml2.2 vient dans le SDK et libxml/HTMLparser.h affirme ce qui suit:

Ce module implémente un analyseur non vérificateur HTML 4.0 avec une API compatible avec celles de l'analyseur XML. Il devrait être capable d'analyser le HTML "du monde réel", même s'il est gravement cassé du point de vue des spécifications.

Cela ressemble à ce dont j'ai besoin, donc je vais probablement l'utiliser.

49
Sophie Alpert

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

Exigences :

-Ajouter libxml2 inclut à votre projet

  1. Menu Projet-> Modifier les paramètres du projet
  2. Rechercher le paramètre "Chemins de recherche d'en-tête"
  3. Ajoutez 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 paramètres du projet
  2. Rechercher le paramètre "Autres indicateurs de l'éditeur de liens"
  3. Ajouter un nouveau drapeau de recherche "-lxml2"

-De hpple récupérez 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

-Faites une promenade w3school XPath Tutorial pour vous sentir à l'aise 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
NSString *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 sont un problème dans votre projet, je recommande de coder votre propre solution légère basée sur le code de bibliothèque hpple et xpathquery.

90
Albaregar

Juste au cas où quelqu'un serait arrivé ici en cherchant un analyseur Nice XPath et serait parti et aurait utilisé TFHpple, notez que TFHpple utilise XPathQuery. C'est assez bien, mais il y a une fuite de mémoire.

Dans la fonction * PerformXPathQuery, si les nœuds s'avèrent nuls, il saute avant le nettoyage.

Donc, là où vous voyez ce morceau 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'analyse, c'est une fuite vicieuse. Maintenant .... comment récupérer ma nuit :-)

20
DavidAWalsh

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

Objective-C-HMTL-Parser

12
Ben Reeves

Vous voudrez peut-être consulter ElementParser. Il fournit une analyse "juste assez" de HTML et XML. De jolies interfaces rendent la navigation dans les documents XML/HTML très simple. http://touchtank.wordpress.com/

5
Lee

Cela dépend probablement du désordre du HTML et de ce que vous voulez extraire. Mais généralement Tidy fait un très bon travail. Il est écrit en C et je suppose que vous devriez pouvoir le construire et le lier statiquement pour l'iPhone. Vous pouvez facilement installer la version en ligne de commande et tester d'abord les résultats.

5
tcurdt

Que diriez-vous d'utiliser le composant Webkit, et éventuellement des packages tiers tels que jquery pour des tâches comme celles-ci? Ne serait-il pas possible de récupérer les données html dans un composant invisible et de profiter des sélecteurs très matures des frameworks javascript?

4
tore

L'API GData Objective-C de Google réimplémente NSXMLElement et d'autres classes connexes qui Apple supprimé 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 code HTML est mal formé (balises fermantes manquantes), cela pourrait ne pas aider beaucoup.

3
dnolen

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

3
Wulkanman