一、前言:
最近有个需求就是需要客户端来解析小说网站的内容,所以对这块进行了一些了解,发现这块的资料还是蛮少的。
基本上都是使用 libxml2 这个东西来做解析,但是这东西的资料也蛮少的,基本上都是用 HPPLE 这个库,这个库是基于 libxml2 封装的一个OC库,地址奉上 https://github.com/topfunky/hpple
简单集成下吧。
二、集成
1、导入文件
把下载下来的项目这个class目录下面的文件导入进来
2、配置属性
2.1、 libxml2.2.dylib 导入framework
2.2 、PROJECT 中的 Search Path - header search paths添加 /usr/include/libxml2
3、封装工具类,使用
直接上代码吧
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface HppleManger : NSObject + (instancetype)sharedHppleMark; /// 获取解析结果 /// @param htmlStr 网页地址 /// @param subStr 网页解析规则 - (void)getListWithHTML:(NSString *)htmlStr andSubscri:(NSString *)subStr; @end NS_ASSUME_NONNULL_END
#import "HppleManger.h" #import "TFHpple.h" @implementation HppleManger static HppleManger *_showWaterMark = nil; + (instancetype)sharedHppleMark{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _showWaterMark = [[super allocWithZone:NULL] init]; }); return _showWaterMark; } + (id)allocWithZone:(struct _NSZone *)zone { return [HppleManger sharedHppleMark]; } - (id)copyWithZone:(struct _NSZone *)zone { return [HppleManger sharedHppleMark]; } - (void)getListWithHTML:(NSString *)htmlStr andSubscri:(NSString *)subStr { NSData * data = [NSData dataWithContentsOfFile:htmlStr]; TFHpple * doc = [[TFHpple alloc] initWithHTMLData:data]; //a[@class='sponsor'] NSArray * elements = [doc searchWithXPathQuery:subStr]; if (elements.count == 0) { return; } TFHppleElement *element = [elements objectAtIndex:0]; [element text]; // The text inside the HTML element (the content of the first text node) [element tagName]; // "a" [element attributes]; // NSDictionary of href, class, id, etc. [element objectForKey:@"href"]; // Easy access to single attribute [element firstChildWithTagName:@"b"]; // The first "b" child node NSLog(@"text:%@",[element text]); NSLog(@"tagName:%@",[element tagName]); NSLog(@"content:%@" , [element content]); }
使用:
NSString *htmlString = @"<br> 全本小说网 最快更新你的灵兽看起来很好吃最新章节!<br /><br />"; NSString *htmlSub = @"//br"; [[HppleManger sharedHppleMark] getListWithHTML:htmlString andSubscri:htmlSub];
三、总结
这个解析要传的规则字符串暂时还没有弄的太清楚,解析失败率也高,经常解析不出来,速度还行,不过没有使用复杂的网页来做。
下一步想直接传一个网址进来直接解析看看效果。
下次再弄这个吧,好累,睡觉去了。