谁能推荐C或Objective-C库进行HTML解析?它需要处理无法完全验证的凌乱的HTML代码。
这样的库是否存在,还是我最好只是尝试使用正则表达式?
谁能推荐C或Objective-C库进行HTML解析?它需要处理无法完全验证的凌乱的HTML代码。
这样的库是否存在,还是我最好只是尝试使用正则表达式?
Answers:
我发现使用hpple解析混乱的HTML非常有用。Hpple项目是XPathQuery库上的Objective-C包装器,用于解析HTML。使用它,您可以发送XPath查询并接收结果。
要求:
-将libxml2 includes添加到您的项目中
-将libxml2库添加到您的项目
-从hpple中获取以下源代码文件,并将其添加到您的项目中:
-在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库代码编写自己的轻量级解决方案。
search:
的TFHpple
重新命名为searchWithXPathQuery:
见https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c6f2060acfcdfb2d3a13a3
看起来像是libxml2.2
SDK中附带的,并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;
}
如果您要进行大量分析,那是一个恶性泄漏。现在....我如何让我的夜晚恢复原状:-)
我围绕libxml编写了一个轻量级的包装,这可能有用:
您可能要签出ElementParser。它提供HTML和XML的“足够”解析。好的接口使在XML / HTML文档中走动非常简单。http://touchtank.wordpress.com/
Google的GData Objective-C API重新实现了Apple从iPhone SDK中删除的NSXMLElement和其他相关类。您可以在http://code.google.com/p/gdata-objectivec-client/中找到它。我已经使用它通过Jabber处理消息。当然,如果您的HTML格式不正确(缺少结束标记),则可能无济于事。