我是以最好的方式解析html源代码吗?

时间:2012-10-17 06:03:11

标签: objective-c parsing nsstring performance

我想从web page中提取正文段落并将它们存储到字符串中。

首先,我使用

获取整个源代码
NSString *sourceCode = [NSString stringWithContentsOfURL:[NSURL URLWithString:currentLink] encoding:NSUTF8StringEncoding error:&error];

正文段落在<!-- (START) Pagination Content Wrapper -->之后开始,在<!-- (END) Pagination Content Wrapper --> 之前结束

所以我打算像这样拆分字符串

NSString *startingPt = @"<!-- (START) Pagination Content Wrapper -->";
NSString *endingPt = @"<!-- (END) Pagination Content Wrapper -->";

NSString *sub = [sourceCode substringFromIndex:NSMaxRange([str rangeOfString:startingPt])];
sub = [sourceCode substringToIndex:[s rangeOfString:endingPt].location;

然后我会使用stringByReplacingOccurrencesOfString:withString:将剩余的html标记替换为@""

有没有更好的方法来实现我的目标?

2 个答案:

答案 0 :(得分:0)

获得子串后删除START&amp; END,您可以简单地使用NSString+HTML categories来转义html标签,它是一个非常好的类别来实现html编码,解码等等,主要是你可以将它用于你的NSString实例,无需创建单独的对象为此目的。

Objective C HTML escape/unescape您可以在这里找到更多有关它的讨论。

这些是可用的方法,如该帖子&amp;我喜欢它。

- (NSString *)stringByConvertingHTMLToPlainText;
- (NSString *)stringByDecodingHTMLEntities;
- (NSString *)stringByEncodingHTMLEntities;
- (NSString *)stringWithNewLinesAsBRs;
- (NSString *)stringByRemovingNewLinesAndWhitespace;

答案 1 :(得分:0)

在删除之前,您必须找到HTML标记。除非您知道该系统需要使用的标签数量有限,否则您不应在代码中对其列表进行硬编码。使用-stringByReplacingOccurrences ...,您需要一个精确的字符串,包含所有参数ID和类标记等,这使得它更容易发生变化。

除非您打算使用vishy建议的第三方扩展程序,看起来它可以满足您的需求,否则您将不得不这样做:

1)找到第一次出现的“&lt;”在字符串中

2)看看“&lt;”逃脱了。

3)如果没有,请找到下一个“&gt;”。

4)查看是否已转义。

5)如果没有,为标签创建一个NSRange(从“&lt;”到“&gt;”)并使用-stringByReplacingCharactersInRange去除它。

6)重复,直到找不到更多未转义的“&lt;”。

这将为您留下去HTML文本,但不是纯文本。您仍将看到HTML转义,同样重要的是,无法保证在删除HTML后,空白(在HTML中被忽略)会有任何意义。