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?

Sophie Alpert
quelle
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.

Albaregar
quelle
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.

Sophie Alpert
quelle
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 :-)

DavidAWalsh
quelle
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
12

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

Objective-C-HMTL-Parser

Ben Reeves
quelle
Sieht gut aus Ben. Ich kann es in meiner kommenden iPad-Anwendung verwenden.
Brock Woolf
2
Die Seite ist nicht erreichbar, du solltest dies auf GitHub posten!
Bentford
Ben, ich habe versucht, deine Bibliothek hinzuzufügen - ist es auch für die iPhone-Entwicklung? seit ich stackoverflow.com/questions/14086354/… bekomme
Dejell
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.

tcurdt
quelle
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/


quelle
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?

riss
quelle
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.

dnolen
quelle
3

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

Wulkanman
quelle
Dies beantwortet die Frage nicht - er sucht nach einer clientseitigen Bibliothek.
Freney