NSXMLDocumentTidyHTML没有整理一些XHTML验证错误

时间:2009-06-23 12:27:50

标签: html objective-c xml cocoa xhtml

我想从网页列表中抓取文字。我做了一些实验,发现我需要的最好方法是通过WebKit。

抓取页面源后,我想使用the technique in this comment.删除所有HTML标记

这是我的代码:

- (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];
    }
}

这在大多数页面上都能正常工作。但是,如果页面未正确验证为XHTML,我有时会从initWithXMLString:方法中收到错误。

这很公平 - 我要求它整理XHTML,所以我希望它能够报告遇到的问题。但是如果验证有问题,它会返回nil和错误,而不是实际整理XHTML。

导致问题的一个特定页面是the Ruby class documentation.

我发现优秀的第三方HTML tidy应用程序可以清理这个XHTML,但我希望NSXMLDocumentTidyHTML能够在cellpadding值周围添加一些引号。这是一个相当基本的清理操作。我并不热衷于在我的代码库中添加另一个依赖项。

Cocoa清理XHTML的方式有什么我想念的吗?或者我只需要咬紧牙关并在我的代码中使用HTML Tidy?

1 个答案:

答案 0 :(得分:3)

XHTML文档被视为XML,因此您可以更好地使用NSXMLDocumentTidyXML标记。