69 votes

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 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?

89voto

Albaregar Points 4440

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

Exigences:

-Ajouter libxml2 comprend à votre projet

  1. Menu Projet->Modifier Les Paramètres Du Projet
  2. Recherche pour le paramètre "l'en-Tête des Chemins de Recherche"
  3. Ajouter un nouveau chemin de recherche "${SDKROOT}/usr/include/libxml2"
  4. Activer l'option récursive

-Ajouter de la bibliothèque libxml2 pour votre projet

  1. Menu Projet->Modifier Les Paramètres Du Projet
  2. Recherche pour le réglage "Autres Drapeaux de l'éditeur de liens"
  3. Ajouter un nouvel indicateur de recherche "-lxml2"

-À partir de hpple obtenir le code source suivant fichiers un les ajouter à votre projet:

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

-Prendre une promenade sur w3school XPath Tutoriel pour se 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 une autre enveloppe, cette option n'est probablement pas le plus efficace. Si la performance est un problème dans votre projet, je vous recommande de code de votre propre solution légère basée sur hpple et xpathquery code de la bibliothèque.

49voto

Ben Alpert Points 30381

On dirait que libxml2.2 vient dans le SDK, et libxml/HTMLparser.h déclare ce qui suit:

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

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

20voto

DavidAWalsh Points 797

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

Dans la fonction * PerformXPathQuery, s'il s'avère que les nœuds sont nuls, la tâche se déclenche avant le nettoyage.

Alors, 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 puis-je récupérer ma nuit :-)

12voto

Ben Reeves Points 2522

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

Objective-C-HMTL-Parser

5voto

tcurdt Points 4916

Cela dépend probablement de la complexité du code HTML et de ce que vous voulez extraire. Mais d'habitude, 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 les résultats en premier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X