在iOS中parsingXML /屏幕抓取的最佳方法是什么? UIWebview或NSXMLParser?

我正在创build一个需要从网页获取一些数据的iOS应用程序。 我的第一个虽然是使用NSXMLParser initWithContentsOfURL:并parsingHTML与NSXMLParser委托。 然而,这种方法似乎很快就会变得痛苦(例如,如果HTML改变了,我将不得不重写parsing代码,这可能会很尴尬)。

看到我正在加载一个网页我也看看UIWebView 。 它看起来像UIWebView可能是要走的路。 stringByEvaluatingJavaScriptFromString:看起来像是一个非常方便的方式来提取数据,并允许将JavaScript存储在一个单独的文件,如果HTML更改将很容易编辑。 但是,使用UIWebView似乎有点hacky(看到UIWebView是一个UIView子类,它可能会阻止主线程,文档说,JavaScript的限制为10MB)。

有没有人有任何关于parsingXML / HTML的build议之前,我陷入困境?

更新:

我写了一篇关于我的解决scheme的博客文章: iOS中的HTMLparsing/屏幕抓取

使用XMLparsing器parsingHTML通常无法正常工作,因为许多网站都有不正确的HTML,而Web浏览器将处理HTML,但严格的XMLparsing器(如NSXMLParser将完全失败。

对于许多脚本语言来说,有很大的更加仁慈的拼写库。 像Python的美丽的汤模块。 不幸的是,我不知道Objective-C的这些模块。

将内容加载到UIWebView可能是最简单的方法。 请注意,您不必将UIWebView放在屏幕上。 您可以创build一个单独的UIWindow ,并将其添加到UIWebView中,以便完成全屏幕渲染。 有一个WWDC2009video关于我的想法。 正如你已经提到的,虽然它不会轻量级。

根据你想要的数据和你需要parsing的页面的复杂性,你也可以使用正则expression式甚至手写parsing器来parsing它。 我已经做了很多次了,对于简单的数据来说,这个效果很好。

我已经做了几次。 我发现的最好的方法是使用libxml2,它有一个HTML模式。 然后您可以使用XPath来查询文档。

使用libxml2 API不是最愉快的。 所以,我通常会把这个页面上logging的XPathQuery.h / .m文件:

http://cocoawithlove.com/2008/10/using-libxml2-for-parsing-and-xpath.html

然后我使用NSConnection获取数据,并用这样的数据查询数据:

 NSArray *tdNodes = PerformHTMLXPathQuery(self.receivedData, @"//td[@class='col-name']/a/span"); 

概要:

  1. 将libxml2添加到项目中,以下是XCode4的一些简要说明: http ://cmar.me/2011/04/20/adding-libxml2-to-an-xcode-4-project/

  2. 获取XPathQuery.h / .m

  3. 使用XPath语句来查询html文档。