Domanda

Qualcuno può raccomandare una libreria C o Objective-C per l'analisi HTML? Deve gestire un codice HTML disordinato che non sarà del tutto validato.

Esiste una libreria del genere, o sto meglio cercando di usare espressioni regolari?

È stato utile?

Soluzione 2

Sembra che libxml2.2 sia disponibile nell'SDK e libxml / HTMLparser.h rivendica quanto segue:

  

Questo modulo implementa un parser non 4.0 di verifica HTML con API compatibile con quelli del parser XML. Dovrebbe essere in grado di analizzare "mondo reale" HTML, anche se gravemente rotto dal punto di vista delle specifiche.

Sembra quello di cui ho bisogno, quindi probabilmente lo userò.

Altri suggerimenti

Ho trovato che usare hpple è molto utile per analizzare l'HTML disordinato. Il progetto Hpple è un wrapper Objective-C nella libreria XPathQuery per l'analisi dell'HTML. Usandolo puoi inviare una query XPath e ricevere il risultato.

Requisiti :

-Aggiungi libxml2 include al tuo progetto

  1. Menu Progetto- > Modifica impostazioni progetto
  2. Cerca per impostazione " Percorsi di ricerca intestazione "
  3. Aggiungi un nuovo percorso di ricerca " $ {SDKROOT} / usr / include / libxml2 "
  4. Abilita opzione ricorsiva

-Aggiungi la libreria libxml2 al tuo progetto

  1. Menu Progetto- > Modifica impostazioni progetto
  2. Cerca impostazioni " Altre bandiere linker "
  3. Aggiungi un nuovo flag di ricerca " -lxml2 "

-Da hpple ottieni i seguenti file di codice sorgente e aggiungili al tuo progetto:

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

-Fai una passeggiata su w3school XPath Tutorial per sentirti a tuo agio con il linguaggio XPath.

Esempio di codice

#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];

Problemi noti

Dato che hpple è un wrapper su XPathQuery che è un altro wrapper, questa opzione probabilmente non è la più efficiente. Se le prestazioni rappresentano un problema nel tuo progetto, ti consiglio di codificare la tua soluzione leggera basata sul codice della libreria hpple e xpathquery.

Nel caso in cui qualcuno sia arrivato qui cercando su Google un buon parser XPath e se ne sia andato e abbia usato TFHpple, nota che TFHpple usa XPathQuery. Questo è abbastanza buono, ma ha una perdita di memoria.

Nella funzione * PerformXPathQuery, se i nodi sono nulli, salta fuori prima di ripulire.

Quindi, dove vedi questo bit di codice: aggiungi le due righe di pulizia.

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

Se stai eseguendo MOLTO analisi, è una falla viziosa. Ora .... come posso riavere la mia notte :-)

Ho scritto un involucro leggero attorno a libxml che potrebbe essere utile:

Objective-C-HMTL-Parser

Probabilmente dipende da quanto è disordinato l'HTML e da cosa vuoi estrarre. Ma di solito Tidy fa un buon lavoro. È scritto in C e immagino che dovresti essere in grado di costruirlo e collegarlo staticamente per l'iPhone. Puoi facilmente installare la versione da riga di comando e testare prima i risultati.

Potresti voler dare un'occhiata a ElementParser. Fornisce " quanto basta " analisi di HTML e XML. Interfacce gradevoli rendono molto semplice la gestione dei documenti XML / HTML. http://touchtank.wordpress.com/

Che ne dici di usare il componente Webkit, e possibilmente pacchetti di terze parti come jquery per attività come queste? Non sarebbe possibile recuperare i dati HTML in un componente invisibile e sfruttare i selettori molto maturi dei framework javascript?

L'API GData Objective-C di Google reimplementa NSXMLElement e altre classi correlate che Apple ha rimosso dall'SDK di iPhone. Puoi trovarlo qui http://code.google.com/p/gdata- ObjectiveC-client / . L'ho usato per gestire i messaggi tramite Jabber. Naturalmente se il tuo HTML non è corretto (tag di chiusura mancanti) questo potrebbe non essere di grande aiuto.

Usiamo Convertigo per analizzare l'HTML sul lato server e restituire un servizio Web JSON pulito e ordinato alle nostre app mobili

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top