在iPhone上解析HTML [关闭]


69

谁能推荐C或Objective-C库进行HTML解析?它需要处理无法完全验证的凌乱的HTML代码。

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


我喜欢他在本主题中提到的Ben Reeves轻巧的包装纸。包装器已在github上移动:Objective-C-HMTL-Parser
yarchiko

1
这个问题如何“没有建设性”?
735Tesla,2014年

Answers:


89

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

要求

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

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

-将libxml2库添加到您的项目

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

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

  1. TFpple.h
  2. TF文件
  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库代码编写自己的轻量级解决方案。


2
我刚才使用了它,到目前为止效果很好。
卡斯滕·西尔兹

使用String Data可以很好地工作。您能告诉我如何从html获取并显示图像吗?
阿克瑟伊,

Askhay,图像未存储在HTML中。您必须获取URL并自己下载。拥有URL后,您可以使用[NSData dataWithContentsOfURL]获取文件。
Maciej Swic

1
自2011年7月8日该法search:TFHpple重新命名为searchWithXPathQuery:https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c6f2060acfcdfb2d3a13a3
Protocole

这对我来说非常有效,谢谢。我确实有一个奇怪的怪癖,其中文件名似乎前面带有空格字符,但这可能是由于编码错误而引起的,与hpple无关。
罗伯特

49

看起来像是libxml2.2SDK中附带的,并libxml/HTMLparser.h具有以下特征:

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

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


19

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

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

因此,您将在此处看到以下代码:在两条清理行中添加。

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

如果您要进行大量分析,那是一个恶性泄漏。现在....我如何让我的夜晚恢复原状:-)


我只能找到自2009年以来未更新的Hpple。在哪里可以找到此“ TFHpple”?
Maciej Swic 2011年

1
github.com/topfunky/hpple-是的,我认为它已经很老了。清理泄漏后,效果很好。
DavidAWalsh 2011年

2
看起来此修补程序已在最新的提交中进行了更新
jfisk,2012年


5

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



4

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


3

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.