2009-06-23 11 views
2

Ich möchte Text aus einer Liste von Webseiten abrufen. Ich habe ein bisschen experimentiert und festgestellt, dass der beste Weg für meine Bedürfnisse über WebKit ist.NSXMLDocumentTidyHTML räumt einige XHTML-Validierungsfehler nicht auf

Sobald die Quelle der Seite gepackt wurde, möchte ich die HTML-Tags alle Streifen aus, von the technique in this comment.

hier mit meinem Code ist:

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame { 
    if(frame == [sender mainFrame]) { 
     NSString *content = [[[[sender mainFrame] dataSource] representation] documentSource]; 
     NSXMLDocument *theDocument = [[NSXMLDocument alloc] initWithXMLString:content options:NSXMLDocumentTidyHTML error:&theError]; 
     NSString *theXSLTString = @"<?xml version='1.0' encoding='utf-8'?>\n<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xhtml='http://www.w3.org/1999/xhtml'>\n<xsl:output method='text'/>\n<xsl:template match='xhtml:head'></xsl:template>\n<xsl:template match='xhtml:script'></xsl:template>\n</xsl:stylesheet>"; 
     NSData *theData = [theDocument objectByApplyingXSLTString:theXSLTString arguments:nil error:&theError]; 
     NSString *theString = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding]; 
    } 
} 

Diese auf den meisten Seiten gut funktioniert. Wenn eine Seite jedoch nicht korrekt als XHTML validiert wird, erhalte ich manchmal einen Fehler von meiner initWithXMLString:-Methode.

Das ist fair genug - ich frage es, um das XHTML aufzuräumen, also würde ich erwarten, dass es berichtet, welche Probleme es angetroffen hat. Aber wenn es ein Problem mit der Validierung gibt, gibt es null und einen Fehler zurück, anstatt das XHTML tatsächlich aufzuräumen.

Eine spezielle Seite, die das Problem verursacht ist the Ruby class documentation.

ich, dass die ausgezeichnete Dritte HTML tidy Anwendung gefunden haben, können Sie diese XHTML feinen aufzuräumen, aber ich würde erwarten, dass NSXMLDocumentTidyHTML der Lage sein, nur einige Zitate hinzufügen, um Cellpadding-Werte. Es ist eine ziemlich einfache Aufräumoperation. Und ich bin nicht scharf darauf, eine weitere Abhängigkeit in meine Codebasis einzufügen.

Gibt es etwas, das mir fehlt, wenn Cocoa XHTML aufräumt? Oder muss ich nur in den sauren Apfel beißen und stattdessen HTML Tidy in meinem Code verwenden?

+0

Ich habe festgestellt, dass dieser Code nicht immer funktioniert, da -ObjectByApplyingXSLTString: arguments: error: ein NSXMLDocument statt NSData zurückgeben kann. –

Antwort

3

XHTML-Dokumente werden als XML behandelt, so dass Sie möglicherweise mehr Glück mit der NSXMLDocumentTidyXML Flagge haben.

+3

Beachten Sie, dass sie sich nicht gegenseitig ausschließen. Sie können NSXMLDocumentTidyHTML | verwenden NSXMLDocumentTidyXML, um beide Verhalten zusammen zu bekommen. TidyXML korrigiert ungültiges XML, um gültig zu sein; TidyHTML erleichtert das Lesen der Zeichenfolgenwerte des Dokuments. –

+0

Vielen Dank Chaps. Wirklich hilfreich. Ich probierte NSXMLDocumentTidyHTML und NSXMLDocumentTidyXML getrennt aus, aber in meiner Frustration vergaß ich, sie zusammen zu versuchen. Das hat den Trick gemacht! Kein Vertrauen mehr in HTML Tidy für mich. Fabelhaft. –

Verwandte Themen