html - NSXMLDocumentTidyHTML 没有清理一些 XHTML 验证错误

标签 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 来代替?

最佳答案

XHTML 文档被视为 XML,因此使用 NSXMLDocumentTidyXML 标志可能会更好。

关于html - NSXMLDocumentTidyHTML 没有清理一些 XHTML 验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1032241/

相关文章:

ios - 在 WatchKit 中更新表格行

javascript - 如何修改 Odoo 8 中的 Backbone JS 功能?

python - 如何使用 Python 解析 XML 文件?

javascript - 检测 DOM 元素是否确实具有 IE8 中定义的属性

javascript - 粒子不会出现在粒子 div 上

javascript - 带有图像的 html 字符串未加载

html - 在按钮元素中间对齐图像和文本

ios - 如何创建居中对齐的 Nsstring

ios - 文档 Main.storyboard 需要 Xcode 8.0 或更高版本

android - 无法使用 PreferenceActivity 中的按钮调用方法