it-swarm.com.de

Analysieren von HTML auf dem iPhone

Kann jemand eine C- oder Objective-C-Bibliothek für das HTML-Parsing empfehlen? Es muss mit unordentlichem HTML-Code umgehen, der nicht ganz validiert werden kann.

Existiert eine solche Bibliothek oder bin ich besser dran, nur reguläre Ausdrücke zu verwenden?

68
Sophie Alpert

Sieht aus wie libxml2.2 kommt im SDK und libxml/HTMLparser.h behauptet Folgendes:

Dieses Modul implementiert einen nicht verifizierenden HTML 4.0-Parser mit einer API, die mit den XML-Parsern kompatibel ist. Es sollte in der Lage sein, HTML-Code aus der realen Welt zu analysieren, auch wenn er aus Sicht der Spezifikation schwer beschädigt ist.

Das hört sich nach dem an, was ich brauche, also werde ich das wahrscheinlich benutzen.

49
Sophie Alpert

Ich fand die Verwendung von hpple sehr nützlich, um unordentliches HTML zu analysieren. Hpple-Projekt ist ein Objective-C-Wrapper für die XPathQuery-Bibliothek zum Parsen von HTML. Mit ihm können Sie eine XPath-Abfrage senden und das Ergebnis empfangen.

Anforderungen :

- Fügen Sie Ihrem Projekt libxml2-Includes hinzu

  1. Menü Projekt-> Projekteinstellungen bearbeiten
  2. Suche nach Einstellung "Header-Suchpfade"
  3. Neuen Suchpfad hinzufügen "$ {SDKROOT}/usr/include/libxml2"
  4. Aktivieren Sie die rekursive Option

- Fügen Sie Ihrem Projekt die libxml2-Bibliothek hinzu

  1. Menü Projekt-> Projekteinstellungen bearbeiten
  2. Suche nach Einstellung "Other Linker Flags"
  3. Neue Suchmarkierung "-lxml2" hinzufügen

-Von hpple besorgen Sie sich die folgenden Quelltextdateien und fügen Sie sie Ihrem Projekt hinzu:

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

- Machen Sie einen Spaziergang auf w3school XPath Tutorial , um sich mit der XPath-Sprache vertraut zu machen.

Codebeispiel

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

Bekannte Probleme

Da hpple ein Wrapper über XPathQuery ist, einem anderen Wrapper, ist diese Option wahrscheinlich nicht die effizienteste. Wenn die Leistung in Ihrem Projekt ein Problem darstellt, empfehle ich, Ihre eigene Lightweight-Lösung auf der Basis von hpple- und xpathquery-Bibliothekscode zu codieren.

90
Albaregar

Nur für den Fall, dass jemand hierher gekommen ist, indem er nach einem netten XPath-Parser gegoogelt und TFHpple verwendet hat, beachten Sie, dass TFHpple XPathQuery verwendet. Das ist ziemlich gut, hat aber einen Speicherverlust.

Wenn in der Funktion * PerformXPathQuery festgestellt wird, dass die Knoten null sind, springt sie vor dem Aufräumen heraus.

Wo sehen Sie diesen Code? Fügen Sie die beiden Bereinigungszeilen hinzu.

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

Wenn Sie eine Menge Parsing machen, ist es ein teuflisches Loch. Nun .... wie bekomme ich meine Nacht zurück :-)

20
DavidAWalsh

Ich habe einen leichten Wrapper um libxml geschrieben, der vielleicht nützlich ist:

Objective-C-HMTL-Parser

12
Ben Reeves

Möglicherweise möchten Sie ElementParser auschecken. Es bietet "gerade genug" Analyse von HTML und XML. Schöne Oberflächen machen das Navigieren in XML/HTML-Dokumenten sehr unkompliziert. http://touchtank.wordpress.com/

5
Lee

Dies hängt wahrscheinlich davon ab, wie unordentlich der HTML-Code ist und was Sie extrahieren möchten. Aber normalerweise macht Tidy ziemlich gute Arbeit. Es ist in C geschrieben und ich denke, Sie sollten es für das iPhone bauen und statisch verknüpfen können. Sie können die Befehlszeilenversion einfach installieren und die Ergebnisse zuerst testen.

5
tcurdt

Wie wäre es mit der Webkit-Komponente und möglicherweise mit Paketen von Drittanbietern wie jquery für Aufgaben wie diese? Wäre es nicht möglich, die HTML-Daten in einer unsichtbaren Komponente abzurufen und die sehr ausgereiften Selektoren des Javascript-Frameworks zu nutzen?

4
tore

Die GData Objective-C-API von Google implementiert NSXMLElement und andere verwandte Klassen, die Apple aus dem iPhone SDK entfernt wurden. Sie finden sie hier http://code.google.com/p/ gdata-goalc-client / . Ich habe es für den Umgang mit Nachrichten über Jabber verwendet. Natürlich hilft dies nicht viel, wenn Ihr HTML-Code fehlerhaft ist (fehlende schließende Tags).

3
dnolen

Wir verwenden Convertigo, um HTML auf der Serverseite zu analysieren und einen sauberen und ordentlichen JSON-Webdienst an unsere mobilen Apps zurückzugeben

3
Wulkanman