【问题标题】:parsing HTML on the iPhone [closed]在 iPhone 上解析 HTML [关闭]
【发布时间】:2010-09-29 04:15:28
【问题描述】:

谁能推荐一个用于 HTML 解析的 C 或 Objective-C 库?它需要处理无法完全验证的混乱 HTML 代码。

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

【问题讨论】:

  • 我喜欢 Ben Reeves 轻量级包装,他在这个帖子中提到过。 Wrapper 已移至 github:Objective-C-HMTL-Parser
  • 这个问题怎么“没有建设性”?

标签: iphone html parsing html-content-extraction


【解决方案1】:

我发现使用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 Tutorial 上走一走,熟悉 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 库代码编写您自己的轻量级解决方案。

【讨论】:

  • 我刚刚用了这个,到目前为止效果很好。
  • 它与字符串数据一起工作得很好。你能告诉我如何从 html 中获取和显示图片吗?
  • Askhay,图像未存储在 HTML 中。您必须获取 URL 并自行下载。获得 URL 后,您可以使用 [NSData dataWithContentsOfURL] 获取文件。
  • 自 2011 年 7 月 8 日起,TFHpple 的方法 search: 已重命名为 searchWithXPathQuery: 参见 https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c6f2060acfcdfb2d3a13a3
  • 这对我来说效果很好,谢谢。我确实有一个奇怪的怪癖,文件名似乎前面有一个空格字符,但这可能是由于编码错误而发生的,与 hpple 无关。
【解决方案2】:

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

Objective-C-HMTL-Parser

【讨论】:

  • 看起来很棒,本。我可能会在我即将推出的 iPad 应用程序中使用它。
  • 网站已关闭,您应该在 GitHub 上发布!
  • Ben,我尝试添加您的库 - 是否也用于 iphone 开发?因为我得到stackoverflow.com/questions/14086354/…
【解决方案3】:

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

【讨论】:

  • 这没有回答问题 - 他正在寻找客户端库。
【解决方案4】:

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

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

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

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

如果您要进行大量解析,那就是恶性泄漏。 现在....我如何才能让我的夜晚回来:-)

【讨论】:

  • 我只能找到自 2009 年以来没有更新的 Hpple。我在哪里可以找到这个“TFHpple”?
  • github.com/topfunky/hpple - 是的,我认为它已经很老了。一旦你清理了泄漏,就可以正常工作了。
  • 看起来此修复已在最新提交中更新
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      看起来libxml2.2 包含在 SDK 中,libxml/HTMLparser.h 声明如下:

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

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          • 2011-12-20
          • 2016-03-23
          • 2010-09-19
          • 2010-10-17
          • 2011-09-17
          • 1970-01-01
          相关资源
          最近更新 更多