最近因为需求,一直在做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数据的更多相关文章

  1. iOS关于XML解析请求数据

    XML数据的请求: 和json请求几乎一样,只有请求参数修改为xml即可: AFHTTPSessionManager *manager = [AFHTTPSessionManager manager] ...

  2. iOS开发-简单解析JSON数据

    什么是JSON   JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组   {“nam ...

  3. iOS项目之模拟请求数据

    如何在iOS开发中更好的做假数据? 当工期比较紧的时候,项目开发中会经常出现移动端等待后端接口数据的情形,不但耽误项目进度,更让人有种无奈的绝望.所以在开发中,我们常常自己做些假数据,以方便开发和UI ...

  4. iOS项目开发实战——plist数组解析

    plist数据是苹果公司创造的数据格式,基于XML,因为在iOS,Mac系统中操作plist很方便,所以我们经常会用到.在iOS项目中.系统会自己主动生成一个Info.plist文件,里面存放了iOS ...

  5. iOS解析XML数据

    iOS中解析XML数据的类是  NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...

  6. iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...

  7. iOS开发网络篇—JSON数据的解析

    iOS开发网络篇—JSON数据的解析 iOS开发网络篇—JSON介绍 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式 ...

  8. iOS开发网络篇—XML数据的解析

     iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...

  9. IOS 解析Json数据(NSJSONSerialization)

    ● 什么是JSON ● JSON是一种轻量级的数据格式,一般用于数据交互 ● 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除 外) ● JSON的格式很像OC中的字典和数组 ...

随机推荐

  1. vue中$set的用法

    数组: this.$set(Array,index, newValue) 对象: this.$set(Object, key, value)

  2. sap 对dynamic query parameters 设置条件。

  3. Python复习基础篇

    4.4 使用列表的一部分   Python切片(切片就是取值的呗) print(players[0:3])  中括号,冒号隔开,顾头不顾尾. print([:4])    从开始取还是会顾尾的 pri ...

  4. MJExtension代码解释

    Runtime 是什么? objective-C会把函数调用的转换为消息发送,objc_MsgSend(receiver, msg), 注意,recevier指的是消息的接受者.那么self, sup ...

  5. Photobucket不能用了怎么办?推荐10个在线图片储存服务!

    近日,图片共享服务网站Photobucket更新了政策,要求用户缴纳399美元的年费,才能使用第三方网站图片储存服务. 由于Photobucket出台这一政策,亚马逊及其他电商平台上相关的产品图片已被 ...

  6. SEO--多领域

    1.社交媒体SEO优化,例如:视频,吸引流量 2.电商SEO,很多不是皇冠的商家也可以被搜索到 3.新媒体 微博 和 微信营销 手机端的SEO等.传统的SEO已经渐渐不具备竞争力 SEO盈利:网盟.广 ...

  7. 多线程:QueueUserWorkItem引发的闭包与变量共享

    //1. public void SaveModel(testmodel msg) { ThreadPool.QueueUserWorkItem(new WaitCallback(SaveModelT ...

  8. iOS UI进阶-1.1 Quartz2D 图片水印/裁剪/截图

    图片水印 UIImage+MJ.h #import <UIKit/UIKit.h> @interface UIImage (MJ) /** * 打水印 * * @param bg 背景图片 ...

  9. MessageBox ---> error C2660: “CWnd::MessageBoxA”: 函数不接受 4 个参数

    解决办法: ::MessageBoxA(NULL,TEXT("程序即将退出,谢谢你的试用!"),TEXT("SIMPLETRBO有线调度台"),MB_OK); ...

  10. idea软件上设置爱彼迎字体