2010-08-22 8 views
8

Ich erstelle eine iOS-App, die einige Daten von einer Webseite abrufen muss. Meine erste war jedoch, NSXMLParser initWithContentsOfURL: zu verwenden und den HTML mit dem Delegierten NSXMLParser zu analysieren. Dieser Ansatz scheint jedoch schnell schmerzhaft zu werden (wenn sich beispielsweise der HTML-Code ändern würde, müsste ich den Parsing-Code neu schreiben, was umständlich sein könnte).Was ist der beste Ansatz zum Parsen von XML/Screen Scraping in iOS? UIWebview oder NSXMLParser?

Da ich eine Webseite lade, habe ich mir auch UIWebView angesehen. Es sieht so aus als ob UIWebView der Weg sein könnte. stringByEvaluatingJavaScriptFromString: scheint eine sehr praktische Möglichkeit zu sein, die Daten zu extrahieren und würde es erlauben, das Javascript in einer separaten Datei zu speichern, die leicht zu bearbeiten wäre, wenn sich der HTML-Code ändert. Allerdings scheint UIWebView ein bisschen hacky zu sein (da UIWebView eine UIView Unterklasse ist, kann es den Hauptthread blockieren, und die Dokumente sagen, dass das Javascript ein Limit von 10MB hat).

Hat jemand einen Rat in Bezug auf das Parsen von XML/HTML, bevor ich feststecke?

UPDATE:

ich einen Blog-Post über meine Lösung schrieb: HTML parsing/screen scraping in iOS

Antwort

6

Parsing HTML mit einem XML-Parser in der Regel sowieso nicht funktionieren, weil viele Websites falsche HTML haben, die einen Web-Browser befassen mit, aber ein strenger XML-Parser wie NSXMLParser wird vollständig fehlschlagen.

Für viele Skriptsprachen gibt es großartige Scraping-Bibliotheken, die barmherziger sind. Wie Pythons Beautiful Soup Modul. Leider kenne ich solche Module für Objective-C nicht.

Laden Zeug in eine UIWebView könnte der einfachste Weg sein, hier zu gehen. Beachten Sie, dass Sie die UIWebView nicht auf dem Bildschirm anzeigen müssen. Sie können eine separate UIWindow erstellen und die UIWebView hinzufügen, so dass Sie das vollständige Off-Screen-Rendering durchführen. Es gab ein WWDC2009 Video darüber denke ich. Wie Sie bereits erwähnt haben, wird es nicht leicht sein.

Abhängig von den gewünschten Daten und der Komplexität der Seiten, die Sie analysieren müssen, können Sie sie möglicherweise auch mit regulären Ausdrücken oder sogar einem handgeschriebenen Parser analysieren. Ich habe das viele Male gemacht, und für einfache Daten funktioniert das gut.

+0

Gute Antwort! Ich denke, es ist wichtig zu beachten, dass sogar korrektes HTML von einem strikten XML-Parser abgelehnt wird - nur XHTML (korrekt geschrieben) hat eine gute Chance, einen XML-Parser zu durchlaufen, was Ihre Empfehlung von UIWebView wirklich am besten macht gehen. – JosephH

+0

Vergessen Sie nicht, dass 'UIWebView' auch alles andere auf der Seite lädt. Bilder, Javascript, etc. Dies könnte zu einer Menge Speicherverbrauch führen. Persönlich würde ich zuerst einen regulären Ausdruck oder einen handgeschriebenen Parser ausprobieren. Wenn das zu schwierig ist, würde ich die Route 'UIWebView' gehen. –

+1

Ausgezeichneter Punkt - Ich hatte die Wohlgeformtheit des Markups nicht berücksichtigt. Das ist für mich entscheidend. –

10

Ich habe dies ein paar Mal getan. Der beste Ansatz, den ich gefunden habe, ist die Verwendung von libxml2 mit einem Modus für HTML. Dann können Sie XPath verwenden, um das Dokument abzufragen.

Die Arbeit mit der libxml2-API ist nicht besonders erfreulich. Also, normalerweise bringe ich die XPathQuery.h /.m-Dateien auf dieser Seite dokumentiert:

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

Dann hole ich die Daten ein NSConnection verwenden und abfragen, die Daten mit etwas wie folgt aus:

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

Zusammenfassung:

  1. hinzufügen libxml2 zu Ihrem Projekt, hier sind einige schnelle Anweisungen für XCode4: http://cmar.me/2011/04/20/adding-libxml2-to-an-xcode-4-project/

  2. Holen Sie sich die XPathQuery.h/.m

  3. Verwendung eine XPath-Anweisung, um das HTML-Dokuments abfragen.

Verwandte Themen