请问有没有人能够推荐一个用于解析HTML的C或Objective-C库?它需要能够处理一些不太符合标准的HTML代码。
是否存在这样的库,或者我最好尝试使用正则表达式来解析HTML?
请问有没有人能够推荐一个用于解析HTML的C或Objective-C库?它需要能够处理一些不太符合标准的HTML代码。
是否存在这样的库,或者我最好尝试使用正则表达式来解析HTML?
我发现使用hpple很有用,可以解析混乱的HTML。 Hpple项目是一个基于XPathQuery库的Objective-C包装器,用于解析HTML。使用它,您可以发送XPath查询并收到结果。
要求:
-将libxml2包含添加到您的项目中
-将libxml2库添加到您的项目中
-从hpple获取以下源代码文件并将它们添加到您的项目中:
-在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 库代码编写自己的轻量级解决方案。
TFHpple
的search:
方法已更名为searchWithXPathQuery:
。请参见https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c6f2060acfcdfb2d3a13a3。 - Protocole看起来SDK中有libxml2.2
,并且libxml/HTMLparser.h
声明了以下内容:
该模块实现了一个与XML解析器API兼容的HTML 4.0非验证解析器。它应该能够解析“现实世界”中的HTML文件,即使是从规范角度严重破损的。
这听起来就是我需要的,所以我可能会使用它。
提醒一下,如果有人通过谷歌搜索一个好的XPath解析器并使用了TFHpple,请注意TFHpple使用XPathQuery。这个工具很不错,但存在内存泄漏问题。
在函数“PerformXPathQuery”中,如果发现节点为空,则会在清理前跳出函数。
所以,在你看到以下代码时,请添加两行清理代码:
xmlNodeSetPtr nodes = xpathObj->nodesetval;
if (!nodes)
{
NSLog(@"Nodes was nil.");
/* Cleanup */
xmlXPathFreeObject(xpathObj);
xmlXPathFreeContext(xpathCtx);
return nil;
}
如果你正在做大量的解析工作,这将导致严重的内存泄漏问题。那么...我该如何挽回我的夜晚呢 :-)