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?
iphone
html
parsing
html-content-extraction
Sophie Alpert
quelle
quelle
Antworten:
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
- Fügen Sie Ihrem Projekt die Bibliothek libxml2 hinzu
- Holen Sie sich von hpple die folgenden Quellcodedateien und fügen Sie sie Ihrem Projekt hinzu:
- 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.
quelle
search:
vonTFHpple
insearchWithXPathQuery:
See https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c6f2060acfcdfb2d3a13a3Sieht so aus, als wäre es
libxml2.2
im SDK enthalten undlibxml/HTMLparser.h
behauptet Folgendes:Das klingt nach dem, was ich brauche, also werde ich das wahrscheinlich nutzen.
quelle
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 :-)
quelle
Ich habe einen leichten Wrapper um libxml geschrieben, der vielleicht nützlich ist:
Objective-C-HMTL-Parser
quelle
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.
quelle
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
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?
quelle
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.
quelle
Wir verwenden Convertigo, um HTML auf der Serverseite zu analysieren und saubere und saubere JSON-Webdienste an unsere mobilen Apps zurückzugeben
quelle