解析iPhone上的HTML

任何人都可以推荐一个C或Objective-C库的HTML解析? 它需要处理凌乱的HTML代码,将不完全验证。

这样的图书馆是否存在,还是我只是试图使用正则表达式?

我发现使用HAPP解析凌乱的HTML相当有用。 Hpple项目是解析HTML的XPathQuery库的Objective-C包装器。 使用它你可以发送XPath查询并接收结果。

要求

– 将libxml2添加到您的项目中

  1. 菜单项目 – >编辑项目设置
  2. 搜索设置“标题搜索路径”
  3. 添加一个新的搜索路径“$ {SDKROOT} / usr / include / libxml2”
  4. 启用递归选项

– 将libxml2库添加到您的项目

  1. 菜单项目 – >编辑项目设置
  2. 搜索设置“其他链接器标志”
  3. 添加一个新的搜索标志“-lxml2”

从hpple获取以下源代码文件并将它们添加到您的项目中:

  1. TFpple.h
  2. TFpple.m
  3. TFppleElement.h
  4. TFppleElement.m
  5. XPathQuery.h
  6. 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服务返回到我们的移动应用程序