iOS项目之解析HTML数据
最近因为需求,一直在做HTML数据的解析,从网页中去获取需要的数据,然后展示到自己的app中。
在网上找了很多资料,大多都是TFHpple这个第三方框架,能够根据标签节点获取对应的数据,但是现在我需要获取标签中属性的值,这个框架就不能满足了(或许因为自己是新手所以不知道方法吧),所以下面介绍我的一些方法:
使用的框架:HTMLParser(https://github.com/volodg/HTMLParser)
准备工作:这个就不多说了,和TFHpple相同,网上很多相关资料
数据需求一:
封装代码:
/**
* 根据标签节点,定义标签属性,获取数据
*
* @param url 网页的URL
* @param tags 标签节点
* @param name 标签属性名称
* @param string 标签属性名称的值
* @param beginString 截取开始位置的字符串
* @param endString 截取终止位置的字符串
*
*/
- (NSMutableArray *)arrayWithHTMLurl:(NSString *)url ChildTags:(NSString *)tags getAttributeName:(NSString *)name string:(NSString *)string beginString:(NSString *)beginString endString:(NSString *)endString
{
NSError *error = nil;
HTMLParser *parser = [[HTMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:url] error:&error];
if (error) {
NSLog(@"error: %@", error);
return nil;
}
HTMLNode *bodyNode = [parser body];
NSArray *spanNodes = [bodyNode findChildTags:tags];
NSMutableArray *array = [NSMutableArray array];
for (HTMLNode *spanNode in spanNodes) {
if ([[spanNode getAttributeNamed:name] isEqualToString:string]) {
NSString *str1 = [spanNode rawContents];
NSRange range1 = [str1 rangeOfString:beginString];
NSString *str2 = [str1 substringFromIndex:range1.location + ];
NSRange range2 = [str2 rangeOfString:endString];
NSString *str = [str2 substringToIndex:range2.location];
if ([str rangeOfString:@"<"].location != NSNotFound) { } else {
[array addObject:str];
}
}
}
return array;
}
实现代码:
NSArray *array = [self arrayWithHTMLurl:urlString ChildTags:@"h3" getAttributeName:@"class" string:@"nospace subject breakall bold" beginString:@"\">" endString:@"</h3>"];
NSLog(@"array = %@", array);
输出结果:
数据需求二:
封装代码:
/**
* 根据标签属性值,获取标签指定属性值数据
*
* @param url 网页URL
* @param tags 标签节点
* @param name 标签属性名称
* @param string 标签属性名称的值
* @param getName 指定属性名称,获取对应值
*
*/
- (NSMutableArray *)arrayWithHTMLurl:(NSString *)url ChildTags:(NSString *)tags getAttributeName:(NSString *)name string:(NSString *)string getName:(NSString *)getName
{
NSError *error = nil;
HTMLParser *parser = [[HTMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:url] error:&error];
if (error) {
NSLog(@"error: %@", error);
return nil;
}
HTMLNode *bodyNode = [parser body];
NSArray *inputNodes1 = [bodyNode findChildTags:tags];
NSMutableArray *array = [NSMutableArray array]; for (HTMLNode *inputNode in inputNodes1) {
if ([[inputNode getAttributeNamed:name] isEqualToString:string]) {
NSString *str = [inputNode getAttributeNamed:getName];
[array addObject:str];
}
}
return array;
}
实现代码:
NSArray *array = [self arrayWithHTMLurl:urlString ChildTags:@"img" getAttributeName:@"class" string:@"avatar big" getName:@"src"];
NSLog(@"array = %@", array);
输出结果:
数据需求三:
封装代码:
/**
* 根据标签属性值中某字符串,获取标签属性值
*
* @param url 网页URL
* @param tags 标签节点
* @param name 标签属性名称
* @separatorString 设置分隔符
* @param prefixString 根据分隔符截取属性中固定前缀
* @param getName 获取对应标签属性值
*
*/
- (NSMutableArray *)arrayWithHTMLurl:(NSString *)url ChildTags:(NSString *)tags getAttributeName:(NSString *)name separatorString:(NSString *)string prefixString:(NSString *)prefixString getName:(NSString *)getName
{
NSError *error = nil;
HTMLParser *parser = [[HTMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:url] error:&error];
if (error) {
return nil;
}
HTMLNode *bodyNode = [parser body];
NSArray *inputNodes1 = [bodyNode findChildTags:tags];
NSMutableArray *array = [NSMutableArray array]; for (HTMLNode *inputNode in inputNodes1) {
NSString *nameStr = [inputNode getAttributeNamed:name];
NSArray *arr = [nameStr componentsSeparatedByString:string];
if ([arr.firstObject isEqualToString:prefixString]) {
NSString *str = [inputNode getAttributeNamed:getName];
[array addObject:str];
}
}
return array;
}
实现代码:
NSArray *array = [self arrayWithHTMLurl:urlString ChildTags:@"img" getAttributeName:@"src" separatorString:@"/" prefixString:@"upload" getName:@"src"];
NSLog(@"array = %@", array);
输出结果:
以上方法经常使用,可以抽取封装成分类。操作比较灵活,可以根据自己的需求进行相应的更改。
若有不足之处,希望大神多多指正。
iOS项目之解析HTML数据的更多相关文章
- iOS关于XML解析请求数据
XML数据的请求: 和json请求几乎一样,只有请求参数修改为xml即可: AFHTTPSessionManager *manager = [AFHTTPSessionManager manager] ...
- iOS开发-简单解析JSON数据
什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {“nam ...
- iOS项目之模拟请求数据
如何在iOS开发中更好的做假数据? 当工期比较紧的时候,项目开发中会经常出现移动端等待后端接口数据的情形,不但耽误项目进度,更让人有种无奈的绝望.所以在开发中,我们常常自己做些假数据,以方便开发和UI ...
- iOS项目开发实战——plist数组解析
plist数据是苹果公司创造的数据格式,基于XML,因为在iOS,Mac系统中操作plist很方便,所以我们经常会用到.在iOS项目中.系统会自己主动生成一个Info.plist文件,里面存放了iOS ...
- iOS解析XML数据
iOS中解析XML数据的类是 NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...
- iOS开发之JSON格式数据的生成与解析
本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...
- iOS开发网络篇—JSON数据的解析
iOS开发网络篇—JSON数据的解析 iOS开发网络篇—JSON介绍 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式 ...
- iOS开发网络篇—XML数据的解析
iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...
- IOS 解析Json数据(NSJSONSerialization)
● 什么是JSON ● JSON是一种轻量级的数据格式,一般用于数据交互 ● 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除 外) ● JSON的格式很像OC中的字典和数组 ...
随机推荐
- vue中根据当前时间进行排序
computed: { newdataList: function() { return this.sortKey(this.dataList, "addtime"); } }, ...
- vue 本地静态图片路径写法
在img标签中 <img src="../../assets/images/haibao/06-2@2x.png" class="" width=&quo ...
- linux中cmake语法的学习
在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大,搞的人头很大.常常,写代码,效率才是王道.这里还有自动化的项目构建工具C ...
- window下git的下载
window下git的下载window下git的下载window下git的下载window下git的下载 https://git-scm.com/download/win https://git-sc ...
- Python Shell 中敲击方向键显示「^[[C^[[D],问题解决
碰到问题后,在网上搜索. 有帖子建议:yum install -y ncurses-devel,我这个2.7.13版本的在Linux下不行.估计是解决python3.x的方案. 尝试网上建议的,装了 ...
- iOS 聊天表情键盘
具体思路 通过UIKeyboardWillChangeFrameNotification通知,监听键盘的改变,同时可以得到键盘的Frame和动画的持续时间, 新建键盘顶部工具条YSComposeToo ...
- 答案在哪里?action config/Interceptor/class/servlet
项目已提测,这两天我们都集中精力梳理外包团队给我司研发的这个三方支付系统的代码逻辑.今天下午爱琴海会议室,开发组里一同学分享他对支付结果回调的梳理成果. 支付结果回调的整体时序是:支付渠道方处理完用户 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (四)(转)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- 将Web项目War包部署到Tomcat服务器基本步骤
参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1. 常识: 1.1 War包 War包一般是在进行Web ...
- 事件响应模型(游戏引擎、JAVA中等应用)
事件,我们在生活中时时在产生事件并且做出响应,如早晨出门时,看见外面下雨了,这时候我们需要带把伞等情况! 在现实生活之中事件分为人为事件和自然事件,那么在计算机操作系统中也不例外,存在两种事件 1.人 ...