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.js-moment的使用
1.安装: npm install moment --save 2.引入:import moment from 'moment.js' 3.moment("时间").format( ...
- emq数据库插件
- Python生态工具、文本处理和系统管理(虚拟)
一.Python生态工具 一.Python内置小工具 1.秒级启动一个下载服务器 Python 内置了一个下载服务器就能够显著提升效率了 . 例如, 你的同事要让你传的文件位于某一个目录下,那么,你可 ...
- (转)以太坊(Ethereum)全零地址(0x000000...)揭秘
最近,一位小伙伴向我咨询问题,说他发现了一个诡异的现象.以太坊的区块链中居然有全是0的地址:0x0000000000000000000000000000000000000000 这究竟是怎么回事儿呢? ...
- Python 全栈开发三 python基础 条件与循环
一. 条件语句 python条件语句是根据一条或多条语句的执行结果的真假(True Or False)来决定代码块的执行. 而执行内容可以多行,以缩进来区分表示同一范围. 1.Python判断条件真假 ...
- openshift node资源限制
在oc的node配置文件中添加 ...... kubeletArguments: cgroups-per-qos: - "true" cgroup-driver: - " ...
- Java语言基础问题
1. 一个Java类文件中可以有几个公有类 在eclipse中测试代码时会出现上图所示的错误,此处只允许用final或abstract来修饰类,也就是一个类文件中只能有一个public修饰的类,此下对 ...
- (已解决) eclipse提示报错"serializing cdt project settings"解决方案
最近在使用eclipse作为cocos2dx的交叉编译工具.但是某天突然相关工程打不开,打开eclipse直接提示 “serializing cdt project settings” has enc ...
- Linux基础(五) Shell函数
Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action ...
- php开启pdo扩展
在Windows环境下php 5.1以上版本中,pdo和主要数据库的驱动同php一起作为扩展发布,要激活它们只需要简单地编辑php.ini文件. 打开php.ini配置文件,找到extension=p ...