最近因为需求,一直在做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);

输出结果:

以上方法经常使用,可以抽取封装成分类。操作比较灵活,可以根据自己的需求进行相应的更改。

若有不足之处,希望大神多多指正。

解析HTML数据的更多相关文章

  1. jQuey知识点三 解析json数据

    1.解析简单数据 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="vie ...

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

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

  3. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  4. iOS解析XML数据

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

  5. 使用jQuery解析JSON数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...

  6. oracle xmltype导入并解析Excel数据 (四)特别说明

    1.Excel导出,此处没有给出 2.错误原因在中间表,T_EXCEL_IMPORT_GENERATION,其中errormsg不为空的数据 3,中间表入库过程: 需要自己实现,为一个存储过程,存储过 ...

  7. oracle xmltype导入并解析Excel数据 (三)解析Excel数据

    包声明 create or replace package PKG_EXCEL_UTILS is -- Author: zkongbai-- Create at: 2016-07-06-- Actio ...

  8. oracle xmltype导入并解析Excel数据--前言

    通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...

  9. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  10. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

随机推荐

  1. [ActionScript 3.0] AS3.0 让一个视频无缝循环播放的一个偏方

    一个视频要循环播放,通常的办法都是播放完后再重新播放,但是不可避免的播放结束和重新开始播放这个时间点上会有停顿,如何解决这个问题,说个偏方吧! package com.views { import f ...

  2. xml 解析

    例:解析以下片段 <font> <name>Helvetica</name> <size units="pt">36</siz ...

  3. 技术那么多,你想看看JSON Schema的测试吗?

    目录 1. 什么是JSON Schema? 2. 如何定义一个JSON Schema 3. 如何测试JSON Schema a) 使用JSON Schema validator GUI b) 在Jav ...

  4. 玩转单元测试之WireMock -- Web服务模拟器

    玩转单元测试之WireMock -- Web服务模拟器 WireMock 是一个灵活的库用于 Web 服务测试,和其他测试工具不同的是,WireMock 创建一个实际的 HTTP服务器来运行你的 We ...

  5. Android自动化初探:ADB

    Info:经过一段时间的准备,从今天开始自学Android之旅,初步学习会有疏漏,以后的每篇文章,我都会不断修改补全,直到完美. 2014-10-09:初版 --------------------- ...

  6. C++中的RTTI机制解析

    RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...

  7. [winserver]设置Server2008R2远程桌面允许每个用户运行多个会话

    首先打开"服务器管理器",选择"角色"-在对话框右边部分选择"添加角色" 根据提示一步步安装即可. 然后在角色中找到"远程桌面服务 ...

  8. ASP.NET中调用存储过程方法

    两种不同的存储过程调用方法 为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法.另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明.本文所 ...

  9. mysql 查询去除空格字符然后倒入新表

    /* 导入数据的时候,有空白字符,去除一下然后导出. 四年前干的事,现在再干一遍. */ $dbhost= '127.0.0.1'; $dbuser= 'root'; $dbpass= '123456 ...

  10. nodejs总结

    1.locomotive Powerful MVC web framework for Node.js. https://github.com/jaredhanson/locomotive 是基于ex ...