2010-08-22 11 views
8

Sto creando un'app per iOS che ha bisogno di ottenere alcuni dati da una pagina web. Il mio primo pensiero è stato quello di utilizzare NSXMLParser initWithContentsOfURL: e analizzare l'HTML con il delegato NSXMLParser. Tuttavia, questo approccio sembra che potrebbe diventare rapidamente doloroso (se, ad esempio, l'HTML fosse cambiato, dovrei riscrivere il codice di analisi che potrebbe essere scomodo).Qual è l'approccio migliore per l'analisi di XML/'screen scraping' in iOS? UIWebview o NSXMLParser?

Visto che sto caricando una pagina Web, ho dato un'occhiata allo UIWebView. Sembra che UIWebView potrebbe essere la strada da percorrere. stringByEvaluatingJavaScriptFromString: sembra un modo molto pratico per estrarre i dati e consentirebbe il javascript di essere memorizzato in un file separato che sarebbe facile da modificare se l'HTML modificato. Tuttavia, l'uso di UIWebView sembra un po 'hacky (visto che UIWebView è una sottoclasse UIView, potrebbe bloccare il thread principale e i documenti dicono che il javascript ha un limite di 10 MB).

Qualcuno ha qualche consiglio in merito all'analisi di XML/HTML prima di rimanere bloccato?

UPDATE:

ho scritto un post su mia soluzione: HTML parsing/screen scraping in iOS

risposta

6

parsing del codice HTML con un parser XML di solito non funziona comunque perché molti siti hanno errato HTML, quale un browser web si occuperà con, ma un parser XML rigoroso come NSXMLParser fallirà completamente.

Per molti linguaggi di scripting esistono grandi librerie di scraping più misericordiose. Come il modulo Beautiful Soup di Python. Sfortunatamente non conosco questi moduli per Objective-C.

Caricamento di materiale in un UIWebView potrebbe essere il modo più semplice per andare qui. Si noti che non è necessario inserire lo schermo UIWebView. È possibile creare un UIWindow separato e aggiungere lo UIWebView ad esso, in modo da eseguire il rendering a schermo intero completo. C'era un video WWDC2009 su questo penso. Come già accennato, non sarà comunque leggero.

A seconda dei dati che si desidera e della complessità delle pagine che è necessario analizzare, è anche possibile analizzarli utilizzando espressioni regolari o un parser scritto a mano. L'ho fatto molte volte e, per i dati semplici, funziona bene.

+0

Buona risposta! Penso che sia importante notare che anche l'HTML corretto verrà rifiutato da un parser XML rigoroso - solo XHTML (correttamente scritto) ha davvero una buona possibilità di ottenere un parser XML, il che rende davvero la raccomandazione di UIWebView il percorso più probabile per partire. – JosephH

+0

Bene, non dimenticare che 'UIWebView' caricherà anche tutto il resto sulla pagina. Immagini, Javascript, ecc. Ciò potrebbe portare a MOLTO uso della memoria. Personalmente, proverei per prima cosa un'espressione regolare o un parser scritto a mano. Se questo è troppo difficile, andrei sulla rotta 'UIWebView'. –

+1

Punto eccellente: non avevo considerato la buona forma del markup. Questo vale per me. –

10

Ho fatto questo alcune volte. L'approccio migliore che ho trovato è di usare libxml2 che ha una modalità per HTML. Quindi è possibile utilizzare XPath per richiedere il documento.

L'utilizzo dell'API libxml2 non è il più piacevole. Quindi, di solito porto su XPathQuery.h /.file m documentate in questa pagina:

http://cocoawithlove.com/2008/10/using-libxml2-for-parsing-and-xpath.html

Poi ho recuperare i dati utilizzando una connessione NSConnection e interrogare i dati con qualcosa di simile:

NSArray *tdNodes = PerformHTMLXPathQuery(self.receivedData, @"//td[@class='col-name']/a/span"); 

Sommario:

  1. Add libxml2 al tuo progetto, ecco alcune istruzioni rapide per XCode4: http://cmar.me/2011/04/20/adding-libxml2-to-an-xcode-4-project/

  2. Prendi il XPathQuery.h/.m

  3. utilizza un'istruzione XPath per interrogare il documento html.

Problemi correlati