代码之家  ›  专栏  ›  技术社区  ›  Sophie Alpert

在iPhone上解析HTML[关闭]

  •  68
  • Sophie Alpert  · 技术社区  · 17 年前

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

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

    9 回复  |  直到 16 年前
        1
  •  89
  •   ldiqual nicholjs    14 年前

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

    必要条件 :

    -将libxml2-includes添加到您的项目中

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

    -将libxml2库添加到项目中

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

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

    1. TFpple。英语字母表的第8个字母
    2. TFpple。男性
    3. TFppleElement。英语字母表的第8个字母
    4. TFppleElement。男性
    5. XPathQuery。英语字母表的第8个字母
    6. XPathQuery。男性

    -继续散步 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的包装器,XPathQuery是另一个包装器,因此此选项可能不是最有效的。如果您的项目存在性能问题,我建议您基于hpple和xpathquery库代码编写自己的轻量级解决方案。

        2
  •  49
  •   Sophie Alpert    17 年前

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

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

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

        3
  •  19
  •   DavidAWalsh    15 年前

    如果有人通过谷歌搜索到一个不错的XPath解析器,然后离开并使用了TFHppple,请注意,TFHpulle使用XPathQuery。这相当不错,但存在内存泄漏。

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

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

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

    如果你正在做大量的解析,这是一个恶性的泄漏。 现在。…我怎样才能回到我的夜晚:-)

        4
  •  12
  •   forsvarir    14 年前

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

    Objective-C-HMTL-Parser

        5
  •  5
  •   tcurdt    17 年前

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

        6
  •  5
  •   Lee Lee    17 年前

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

        7
  •  4
  •   tore    15 年前

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

        8
  •  3
  •   dnolen    17 年前

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

        9
  •  3
  •   Wulkanman    14 年前

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