Was ist der beste Ansatz zum Parsen von XML / Screen Scraping in iOS? UIWebview oder NSXMLParser?

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-Code mit dem NSXMLParser -Delegaten 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).

Da ich gerade eine Webseite lade, habe ich mir auch UIWebView angeschaut. Es sieht so aus, als wäre UIWebView der richtige Weg. 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. Die Verwendung von UIWebView scheint jedoch ein bisschen hacky zu sein (da UIWebView eine UIView Unterklasse ist, kann sie den Hauptthread blockieren, und die Dokumente sagen, dass das Javascript eine Grenze von 10MB hat).

Hat jemand irgendeinen Rat bezüglich des Parsens von XML / HTML, bevor ich feststecke?

UPDATE:

Ich habe einen Blogpost über meine Lösung geschrieben: HTML-Analyse / Screen Scraping in iOS

    
Benedict Cohen 22.08.2010, 13:22
quelle

2 Antworten

6

Das Parsen von HTML mit einem XML-Parser funktioniert normalerweise nicht, da viele Websites falsches HTML haben, mit dem sich ein Web-Browser befasst, aber ein strikter XML-Parser wie NSXMLParser scheitert vollständig.

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 von Zeug in ein UIWebView könnte der einfachste Weg sein, hier zu gehen. Beachten Sie, dass Sie UIWebView nicht auf dem Bildschirm anzeigen müssen. Sie können ein separates UIWindow erstellen und das UIWebView hinzufügen, sodass Sie das vollständige Rendern außerhalb des Bildschirms ausführen können. 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 mithilfe von regulären Ausdrücken oder sogar einem handgeschriebenen Parser analysieren. Ich habe das viele Male gemacht, und für einfache Daten funktioniert das gut.

    
Stefan Arentz 22.08.2010, 15:12
quelle
10

Ich habe das ein paar Mal gemacht. 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. Daher bringe ich normalerweise die auf dieser Seite dokumentierten XPathQuery.h / .m-Dateien mit:

Ссылка

Dann hole ich die Daten mit einer NSConnection und frage die Daten mit etwas wie folgt ab:

%Vor%

Zusammenfassung:

  1. Fügen Sie Ihrem Projekt libxml2 hinzu, hier sind einige kurze Anweisungen für XCode4: Ссылка

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

  3. Verwenden Sie eine XPath-Anweisung, um das HTML-Dokument abzufragen.

cmar 21.04.2011 21:07
quelle