Question

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

Une telle bibliothèque existe-t-elle ou est-il préférable d'essayer simplement d'utiliser des expressions régulières?

Était-ce utile?

La solution 2

On dirait que libxml2.2 est inclus dans le kit de développement, et libxml / HTMLparser.h revendique ce qui suit:

  

Ce module implémente un analyseur HTML 4.0 non vérifiant avec une API compatible avec ceux de l’analyseur XML. Il devrait pouvoir analyser " le monde réel " HTML, même s'il est gravement endommagé du point de vue des spécifications.

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

Autres conseils

J'ai trouvé que hpple était très utile pour analyser du code HTML malpropre. Le projet Hpple est un wrapper d'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.

Conditions requises :

-Ajouter libxml2 inclut à votre projet

  1. Menu Projet- > Modifier les paramètres du projet
  2. Recherche du 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 paramètres du projet
  2. Recherche du paramètre "Autres drapeaux de l'éditeur de liens"
  3. Ajouter un nouveau drapeau de recherche " -lxml2 "

-Dans 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 dans le didacticiel w3school XPath 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 par rapport à XPathQuery, un autre wrapper, cette option n’est probablement pas la plus efficace. Si les performances posent un problème dans votre projet, je vous recommande de coder votre propre solution légère basée sur le code de bibliothèque hpple et xpathquery.

Juste au cas où quelqu'un arriverait ici en cherchant un bon analyseur XPath et utiliserait TFHpple, notez que TFHpple utilise XPathQuery. C'est très bien, mais il y a une fuite de mémoire.

Dans la fonction * PerformXPathQuery, s'il s'avère que les nœuds sont nuls, il sortira avant le nettoyage.

Alors, où vous voyez ce bout 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 effectuez BEAUCOUP d'analyse, 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:

Analyseur Objective-C-HMTL

Cela dépend probablement de la saleté du code 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.

Vous pouvez vouloir vérifier ElementParser. Il fournit " juste assez " l'analyse de HTML et XML. De belles interfaces facilitent la navigation dans les 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 d'extraire 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 d’autres classes connexes que Apple a supprimées du kit de développement logiciel (SDK) pour 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 ne vous aidera peut-être pas beaucoup.

Nous utilisons Convertigo pour analyser le code HTML côté serveur et renvoyer un service Web JSON propre et soigné à nos applications mobiles

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top