解析iPhone上的HTML
任何人都可以推荐一个C或Objective-C库的HTML解析? 它需要处理凌乱的HTML代码,将不完全验证。
这样的图书馆是否存在,还是我只是试图使用正则表达式?
我发现使用HAPP解析凌乱的HTML相当有用。 Hpple项目是解析HTML的XPathQuery库的Objective-C包装器。 使用它你可以发送XPath查询并接收结果。
要求 :
– 将libxml2添加到您的项目中
- 菜单项目 – >编辑项目设置
- 搜索设置“标题搜索路径”
- 添加一个新的搜索路径“$ {SDKROOT} / usr / include / libxml2”
- 启用递归选项
– 将libxml2库添加到您的项目
- 菜单项目 – >编辑项目设置
- 搜索设置“其他链接器标志”
- 添加一个新的搜索标志“-lxml2”
从hpple获取以下源代码文件并将它们添加到您的项目中:
- TFpple.h
- TFpple.m
- TFppleElement.h
- TFppleElement.m
- XPathQuery.h
- XPathQuery.m
– 在w3school XPath教程上散步,感受XPath语言的舒适感。
代码示例
#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];
已知的问题
由于hpple是另一个包装器XPathQuery的包装器,所以这个选项可能不是最有效的。 如果性能是您项目中的问题,我建议您使用hpple和xpathquery库代码编写自己的轻量级解决方案。
看起来像libxml2.2
在SDK中,而libxml/HTMLparser.h
声称如下:
该模块实现了一个HTML 4.0非验证解析器,其API与XML解析器兼容。 它应该能够解析“真实世界”的HTML,即使从规范的角度来看严重破碎。
这听起来像我所需要的,所以我可能会使用它。
只是为了防止任何人通过搜索一个很好的XPath解析器,并使用TFHpple,请注意,TFHpple使用XPathQuery。 这很不错,但有内存泄漏。
在函数* PerformXPathQuery中,如果发现节点为零,则在清理前跳出。
所以你看到这一点的代码:添加在两个清理线。
xmlNodeSetPtr nodes = xpathObj->nodesetval; if (!nodes) { NSLog(@"Nodes was nil."); /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); return nil; }
如果你正在做很多的解析,这是一个恶意的泄漏。 现在….我怎么得到我的晚上回来:-)
我写了一个关于libxml的轻量级包装器,这可能是有用的:
Objective-C的-HMTL解析器
这可能取决于HTML是多么混乱,你想要提取什么。 但通常泰迪做得相当不错。 它是用C编写的,我想你应该能够为iPhone构建和静态链接它。 您可以轻松安装命令行版本并首先测试结果。
你可能想看看ElementParser。 它提供了“恰到好处”的HTML和XML解析。 好的界面让XML / HTML文档变得非常简单。 http://touchtank.wordpress.com/
如何使用Webkit组件,以及可能的第三方包,如jQuery的任务,如这些? 难道不可能在一个不可见的组件中获取html数据,并利用JavaScript框架的非常成熟的选择器?
Google的GData Objective-C API重新实现了Apple从iPhone SDK中删除的NSXMLElement和其他相关类。 你可以在http://code.google.com/p/gdata-objectivec-client/找到它。; 我用它通过Jabber处理消息。 当然,如果你的HTML格式不正确(缺少结束标签),这可能没有多大帮助。
我们使用Convertigo在服务器端解析HTML,并将干净利落的JSON Web服务返回到我们的移动应用程序