68

任何人都可以推荐用于 HTML 解析的 C 或 Objective-C 库吗?它需要处理无法完全验证的混乱 HTML 代码。

是否存在这样的库,或者我最好尝试使用正则表达式?

4

9 回答 9

89

我发现使用hpple来解析凌乱的 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 库代码编写您自己的轻量级解决方案。

于 2009-10-24T15:30:40.633 回答
49

看起来像libxml2.2在 SDK 中,并libxml/HTMLparser.h声称以下内容:

该模块实现了一个 HTML 4.0 非验证解析器,其 API 与 XML 解析器兼容。它应该能够解析“真实世界”的 HTML,即使从规范的角度来看严重破坏。

这听起来像是我需要的,所以我可能会使用它。

于 2009-01-02T05:35:05.613 回答
19

以防万一有人通过谷歌搜索一个不错的 XPath 解析器并离开并使用 TFHpple,请注意 TFHpple 使用 XPathQuery。这很好,但有内存泄漏。

在*PerformXPathQuery函数中,如果发现节点为nil,则在清理之前跳出。

所以你在哪里看到这段代码:添加两个清理行。

  xmlNodeSetPtr nodes = xpathObj->nodesetval;
  if (!nodes)
    {
      NSLog(@"Nodes was nil.");
        /* Cleanup */
        xmlXPathFreeObject(xpathObj);
        xmlXPathFreeContext(xpathCtx);
      return nil;
    }

如果你正在做大量的解析,这是一个恶性泄漏。现在....我如何让我的夜晚回来:-)

于 2011-03-09T12:57:59.603 回答
12

我围绕 libxml 编写了一个轻量级包装器,它可能有用:

Objective-C-HMTL-解析器

于 2010-05-10T21:18:07.673 回答
5

这可能取决于 HTML 的混乱程度以及您要提取的内容。但通常Tidy做得很好。它是用 C 语言编写的,我想您应该能够为 iPhone 构建和静态链接它。您可以轻松安装命令行版本并首先测试结果。

于 2009-01-02T02:14:19.417 回答
5

您可能想查看 ElementParser。它提供了对 HTML 和 XML 的“刚刚好”的解析。漂亮的界面使浏览 XML/HTML 文档变得非常简单。http://touchtank.wordpress.com/

于 2009-04-29T20:46:38.230 回答
4

使用 Webkit 组件以及可能的第三方包(如 jquery)来完成此类任务怎么样?难道不能在一个不可见的组件中获取 html 数据并利用 javascript 框架非常成熟的选择器吗?

于 2011-01-27T11:39:41.073 回答
3

Google 的 GData Objective-C API 重新实现了 Apple 从 iPhone SDK 中删除的 NSXMLElement 和其他相关类。你可以在这里找到它http://code.google.com/p/gdata-objectivec-client/。我用它来通过 Jabber 处理消息。当然,如果您的 HTML 格式不正确(缺少结束标签),这可能无济于事。

于 2009-01-02T06:09:22.173 回答
3

我们使用 Convertigo 在服务器端解析 HTML 并将干净整洁的 JSON Web 服务返回到我们的移动应用程序

于 2012-01-12T18:18:50.457 回答