解析iPhone上的HTML

时间:2009-01-02 00:37:51

标签: iphone html parsing html-content-extraction

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

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

9 个答案:

答案 0 :(得分:89)

我发现使用hpple对于解析凌乱的HTML非常有用。 Hpple项目是用于解析HTML的XPathQuery库上的Objective-C包装器。使用它,您可以发送XPath查询并接收结果。

<强>要求

- 将libxml2添加到您的项目中

  1. 菜单项目 - &gt;编辑项目设置
  2. 搜索设置“标头搜索路径”
  3. 添加新搜索路径“$ {SDKROOT} / usr / include / libxml2”
  4. 启用递归选项
  5. - 将libxml2库添加到您的项目

    1. 菜单项目 - &gt;编辑项目设置
    2. 搜索设置“其他链接标记”
    3. 添加新的搜索标记“-lxml2”
    4. -From hpple获取以下源代码文件,并将它们添加到您的项目中:

      1. TFpple.h
      2. TFpple.m
      3. TFppleElement.h
      4. TFppleElement.m
      5. XPathQuery.h
      6. XPathQuery.m
      7. - 在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库代码编写自己的轻量级解决方案。

答案 1 :(得分:49)

看起来SDK中有libxml2.2libxml/HTMLparser.h声明了以下内容:

  

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

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

答案 2 :(得分:20)

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

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

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

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

如果您正在进行大量解析,那就是恶性泄漏。 现在....我怎么回到我的晚上: - )

答案 3 :(得分:12)

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

Objective-C-HMTL-Parser

答案 4 :(得分:5)

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

答案 5 :(得分:5)

您可能想要查看ElementParser。它提供了“足够”的HTML和XML解析。漂亮的界面使XML / HTML文档非常简单。 http://touchtank.wordpress.com/

答案 6 :(得分:4)

如何使用Webkit组件,以及可能的第三方软件包(如jquery)来完成这些任务?是不是可以在一个不可见的组件中获取html数据并利用javascript框架的非常成熟的选择器?

答案 7 :(得分:3)

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

答案 8 :(得分:2)

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