Frage

Kann mir jemand eine C oder Objective-C-Bibliothek für HTML-Analyse empfehlen? Es muss chaotisch HTML-Code verarbeiten, die nicht ganz bestätigen wird.

Gibt es eine solche Bibliothek vorhanden sein, oder ich bin besser dran, nur reguläre Ausdrücke zu verwenden versuchen?

War es hilfreich?

Lösung 2

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

  

Dieses Modul implementiert einen HTML 4.0 Nicht-Überprüfung Parser mit API mit den XML-Parser diejenigen kompatibel. Es sollte in der Lage sein „reale Welt“ HTML zu analysieren, auch wenn stark von einer Spezifikation Sicht gebrochen.

Das klingt wie das, was ich brauche, also bin ich wahrscheinlich, dass nicht benutzen wollen.

Andere Tipps

Ich fand mit hpple sehr nützlich chaotisch HTML zu analysieren. Hpple Projekt ist ein Objective-C-Wrapper auf der xPathQuery Bibliothek für HTML-Parsing. Mit ihm können Sie eine XPath-Abfrage senden und das Ergebnis erhalten.

Anforderungen: :

-Add libxml2 enthält zu einem Projekt

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

-Add libxml2 Bibliothek zu Ihrem Projekt

  1. Menü-Ausbau-> Projekteinstellungen bearbeiten
  2. Suche nach "Andere Linker Flags"
  3. Einstellung
  4. Fügen Sie eine neue Suche Flag "-lxml2"

hpple erhalten die folgenden Quellcode-Dateien ein fügen Sie sie in Ihr Projekt:

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

-Take einen Spaziergang auf w3school XPath Tutorial mit der XPath-Sprache wohl zu fühlen.

Code-Beispiel

#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

Wie hpple ein Wrapper über xPathQuery ist, die eine andere Wrapper ist, diese Option ist wahrscheinlich nicht die effizienteste. Wenn die Leistung ist ein Problem in Ihrem Projekt, empfehle ich Ihre eigene leichte Lösung zu codieren, basierend auf hpple und xPathQuery Bibliothekscode.

Für den Fall, jemand hat durch googeln für einen schönen XPath-Parser hier bekam und abgegangen und verwendet TFHpple, Beachten Sie, dass TFHpple xPathQuery verwendet. Das ist ziemlich gut, aber hat einen Speicherverlust.

In der Funktion * PerformXPathQuery, wenn die Knoten gefunden werden, gleich Null zu sein, es springt vor bis zu reinigen.

Also, wo Sie dieses Stück Code sehen: Fügen Sie in den zwei Bereinigungs Linien

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

Wenn Sie eine Menge von Parsing tun, dann ist es ein Teufels Leck. Nun .... wie erhalte ich meine Nacht zurück: -)

Ich schrieb eine leichte Wrapper um Libxml welche vielleicht nützlich:

Objective-C-HMTL-Parser

Das hängt wahrscheinlich, wie chaotisch die HTML ist und was Sie wollen extrahieren. Aber in der Regel Tidy macht einen ziemlich guten Job. Es ist in C geschrieben und ich denke, sollten Sie in der Lage sein, zu bauen und zu statisch für das iPhone zu verbinden. Sie können ganz einfach die Befehlszeilenversion installieren und zunächst die Ergebnisse testen.

Sie möchten ElementParser überprüfen. Es bietet „gerade genug“ Parsen von HTML und XML. Nizza Schnittstellen machen zu Fuß rund um XML / HTML-Dokumente sehr einfach. http://touchtank.wordpress.com/

Wie wäre es die Webkit Komponente und möglicherweise Pakete von Drittanbietern wie jquery für Aufgaben wie diese? Wäre es nicht möglich sein, die HTML-Daten in einem unsichtbaren Komponente zu holen und die Vorteile der sehr reifen Selektoren der JavaScript-Frameworks nehmen?

Google GData Objective-C-API reimplementiert NSXMLElement und andere verwandte Klassen, die von Apple aus dem iPhone SDK entfernt. Sie können es finden hier http://code.google.com/p/gdata- Objective-client / . Ich habe es über Jabber für den Umgang Messaging verwendet. Natürlich, wenn Sie Ihre HTML (fehlende End-Tags) fehlerhaft ist dies nicht viel helfen könnte.

Wir Convertigo verwenden HTML-Datei auf der Server-Seite zu analysieren und einen sauberen und ordentlichen JSON Web-Service zu unseren mobilen Apps zurückkehren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top