任何人都可以推荐用于 HTML 解析的 C 或 Objective-C 库吗?它需要处理无法完全验证的混乱 HTML 代码。
是否存在这样的库,或者我最好尝试使用正则表达式?
任何人都可以推荐用于 HTML 解析的 C 或 Objective-C 库吗?它需要处理无法完全验证的混乱 HTML 代码。
是否存在这样的库,或者我最好尝试使用正则表达式?
我发现使用hpple来解析凌乱的 HTML 非常有用。Hpple 项目是用于解析 HTML 的 XPathQuery 库的 Objective-C 包装器。使用它,您可以发送 XPath 查询并接收结果。
要求:
- 将 libxml2 包含到您的项目中
- 将 libxml2 库添加到您的项目中
-从 hpple获取以下源代码文件并将它们添加到您的项目中:
- 浏览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函数中,如果发现节点为nil,则在清理之前跳出。
所以你在哪里看到这段代码:添加两个清理行。
xmlNodeSetPtr nodes = xpathObj->nodesetval;
if (!nodes)
{
NSLog(@"Nodes was nil.");
/* Cleanup */
xmlXPathFreeObject(xpathObj);
xmlXPathFreeContext(xpathCtx);
return nil;
}
如果你正在做大量的解析,这是一个恶性泄漏。现在....我如何让我的夜晚回来:-)
我围绕 libxml 编写了一个轻量级包装器,它可能有用:
这可能取决于 HTML 的混乱程度以及您要提取的内容。但通常Tidy做得很好。它是用 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 服务返回到我们的移动应用程序