Parsen von HTML auf dem iPhone [geschlossen]


69

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

Gibt es eine solche Bibliothek oder ist es besser, wenn ich nur versuche, reguläre Ausdrücke zu verwenden?


Ich mag Ben Reeves leichte Verpackung, die er in diesem Thread erwähnt hat. Wrapper ist auf Github umgezogen: Objective-C-HMTL-Parser
Yarchiko

1
Wie ist diese Frage "nicht konstruktiv"?
735Tesla

Antworten:


89

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

Anforderungen :

- Fügen Sie libxml2 zu Ihrem Projekt hinzu

  1. Menü Projekt-> Projekteinstellungen bearbeiten
  2. Suchen Sie nach der Einstellung "Header-Suchpfade"
  3. Fügen Sie einen neuen Suchpfad hinzu "$ {SDKROOT} / usr / include / libxml2"
  4. Aktivieren Sie die rekursive Option

- Fügen Sie Ihrem Projekt die Bibliothek libxml2 hinzu

  1. Menü Projekt-> Projekteinstellungen bearbeiten
  2. Suchen Sie nach der Einstellung "Andere Linker-Flags"
  3. Fügen Sie ein neues Suchflag "-lxml2" hinzu.

- Holen Sie sich von hpple die folgenden Quellcodedateien 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 im 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, der ein weiterer Wrapper ist, ist diese Option wahrscheinlich nicht die effizienteste. Wenn die Leistung in Ihrem Projekt ein Problem darstellt, empfehle ich, Ihre eigene Lightweight-Lösung basierend auf dem Bibliothekscode hpple und xpathquery zu codieren.


2
Ich habe das gerade benutzt und es hat bisher sehr gut funktioniert.
Karsten Silz

Es funktioniert sehr gut mit den String-Daten. Können Sie mir bitte sagen, wie ich ein Bild aus dem HTML-Code erhalten und anzeigen kann?
Akshay

Askhay, Bilder werden nicht im HTML gespeichert. Sie müssen die URL abrufen und selbst herunterladen. Sie können [NSData dataWithContentsOfURL] verwenden, um die Datei abzurufen, sobald Sie die URL haben.
Maciej Swic

1
Seit dem 8. Juli 2011 wurde die Methode search:von TFHpplein searchWithXPathQuery:See https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c6f2060acfcdfb2d3a13a3
Protocole

Das hat bei mir sehr gut funktioniert, danke. Ich habe eine seltsame Eigenart, bei der Dateinamen ein Leerzeichen vorangestellt zu sein scheint, aber dies kann aufgrund eines Codierungsfehlers auftreten und hat nichts mit hpple zu tun.
Robert

49

Sieht so aus, als wäre es libxml2.2im SDK enthalten und libxml/HTMLparser.hbehauptet Folgendes:

Dieses Modul implementiert einen HTML 4.0-Parser ohne Überprüfung mit einer API, die mit den XML-Parser kompatibel ist. Es sollte in der Lage sein, HTML aus der "realen Welt" zu analysieren, auch wenn es unter dem Gesichtspunkt der Spezifikation stark beschädigt ist.

Das klingt nach dem, was ich brauche, also werde ich das wahrscheinlich nutzen.


19

Nur für den Fall, dass jemand hierher gekommen ist, indem er nach einem netten XPath-Parser gegoogelt hat 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 Bereinigen heraus.

Wo Sie also diesen Code sehen: 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 viel analysieren, ist es ein bösartiges Leck. Nun ... wie bekomme ich meine Nacht zurück :-)


Ich kann nur Hpple finden, das seit 2009 nicht mehr aktualisiert wurde. Wo finde ich dieses "TFHpple"?
Maciej Swic

1
github.com/topfunky/hpple - Ja, ich denke es ist ziemlich alt. Funktioniert aber gut, sobald Sie das Leck aufgeräumt haben.
DavidAWalsh

2
Es sieht so aus, als ob dieses
Update


5

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


5

Vielleicht möchten Sie ElementParser ausprobieren. Es bietet "gerade genug" Parsing von HTML und XML. Dank der schönen Benutzeroberfläche können Sie problemlos in XML / HTML-Dokumenten herumlaufen. http://touchtank.wordpress.com/



4
ElementParser ist ziemlich fehlerhaft und seit 2009 nicht mehr aktualisiert. Ich rate dringend davon ab, es zu verwenden.
Steipete

4

Wie wäre es mit der Webkit-Komponente und möglicherweise 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 der Javascript-Frameworks zu nutzen?


3

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


3

Wir verwenden Convertigo, um HTML auf der Serverseite zu analysieren und saubere und saubere JSON-Webdienste an unsere mobilen Apps zurückzugeben


Dies beantwortet die Frage nicht - er sucht nach einer clientseitigen Bibliothek.
Freney
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.