最近因为需求,一直在做HTML数据的解析,从网页中去获取需要的数据,然后展示到自己的app中。
在网上找了很多资料,大多都是TFHpple这个第三方框架,能够根据标签节点获取对应的数据,但是现在我需要获取标签中属性的值,这个框架就不能满足了(或许因为自己是新手所以不知道方法吧),所以下面介绍我的一些方法:
使用的框架:HTMLParser(https://github.com/volodg/HTMLParser)
准备工作:这个就不多说了,和TFHpple相同,网上很多相关资料
数据需求一:
封装代码:
1 /** 2 * 根据标签节点,定义标签属性,获取数据 3 * 4 * @param url 网页的URL 5 * @param tags 标签节点 6 * @param name 标签属性名称 7 * @param string 标签属性名称的值 8 * @param beginString 截取开始位置的字符串 9 * @param endString 截取终止位置的字符串 10 * 11 */ 12 - (NSMutableArray *)arrayWithHTMLurl:(NSString *)url ChildTags:(NSString *)tags getAttributeName:(NSString *)name string:(NSString *)string beginString:(NSString *)beginString endString:(NSString *)endString 13 { 14 NSError *error = nil; 15 HTMLParser *parser = [[HTMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:url] error:&error]; 16 if (error) { 17 NSLog(@"error: %@", error); 18 return nil; 19 } 20 HTMLNode *bodyNode = [parser body]; 21 NSArray *spanNodes = [bodyNode findChildTags:tags]; 22 NSMutableArray *array = [NSMutableArray array]; 23 for (HTMLNode *spanNode in spanNodes) { 24 if ([[spanNode getAttributeNamed:name] isEqualToString:string]) { 25 NSString *str1 = [spanNode rawContents]; 26 NSRange range1 = [str1 rangeOfString:beginString]; 27 NSString *str2 = [str1 substringFromIndex:range1.location + 2]; 28 NSRange range2 = [str2 rangeOfString:endString]; 29 NSString *str = [str2 substringToIndex:range2.location]; 30 if ([str rangeOfString:@"<"].location != NSNotFound) { 31 32 } else { 33 [array addObject:str]; 34 } 35 } 36 } 37 return array; 38 }
实现代码:
1 NSArray *array = [self arrayWithHTMLurl:urlString ChildTags:@"h3" getAttributeName:@"class" string:@"nospace subject breakall bold" beginString:@"">" endString:@"</h3>"]; 2 NSLog(@"array = %@", array);
输出结果:
数据需求二:
封装代码:
1 /** 2 * 根据标签属性值,获取标签指定属性值数据 3 * 4 * @param url 网页URL 5 * @param tags 标签节点 6 * @param name 标签属性名称 7 * @param string 标签属性名称的值 8 * @param getName 指定属性名称,获取对应值 9 * 10 */ 11 - (NSMutableArray *)arrayWithHTMLurl:(NSString *)url ChildTags:(NSString *)tags getAttributeName:(NSString *)name string:(NSString *)string getName:(NSString *)getName 12 { 13 NSError *error = nil; 14 HTMLParser *parser = [[HTMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:url] error:&error]; 15 if (error) { 16 NSLog(@"error: %@", error); 17 return nil; 18 } 19 HTMLNode *bodyNode = [parser body]; 20 NSArray *inputNodes1 = [bodyNode findChildTags:tags]; 21 NSMutableArray *array = [NSMutableArray array]; 22 23 for (HTMLNode *inputNode in inputNodes1) { 24 if ([[inputNode getAttributeNamed:name] isEqualToString:string]) { 25 NSString *str = [inputNode getAttributeNamed:getName]; 26 [array addObject:str]; 27 } 28 } 29 return array; 30 }
实现代码:
1 NSArray *array = [self arrayWithHTMLurl:urlString ChildTags:@"img" getAttributeName:@"class" string:@"avatar big" getName:@"src"]; 2 NSLog(@"array = %@", array);
输出结果:
数据需求三:
封装代码:
1 /** 2 * 根据标签属性值中某字符串,获取标签属性值 3 * 4 * @param url 网页URL 5 * @param tags 标签节点 6 * @param name 标签属性名称 7 * @separatorString 设置分隔符 8 * @param prefixString 根据分隔符截取属性中固定前缀 9 * @param getName 获取对应标签属性值 10 * 11 */ 12 - (NSMutableArray *)arrayWithHTMLurl:(NSString *)url ChildTags:(NSString *)tags getAttributeName:(NSString *)name separatorString:(NSString *)string prefixString:(NSString *)prefixString getName:(NSString *)getName 13 { 14 NSError *error = nil; 15 HTMLParser *parser = [[HTMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:url] error:&error]; 16 if (error) { 17 return nil; 18 } 19 HTMLNode *bodyNode = [parser body]; 20 NSArray *inputNodes1 = [bodyNode findChildTags:tags]; 21 NSMutableArray *array = [NSMutableArray array]; 22 23 for (HTMLNode *inputNode in inputNodes1) { 24 NSString *nameStr = [inputNode getAttributeNamed:name]; 25 NSArray *arr = [nameStr componentsSeparatedByString:string]; 26 if ([arr.firstObject isEqualToString:prefixString]) { 27 NSString *str = [inputNode getAttributeNamed:getName]; 28 [array addObject:str]; 29 } 30 } 31 return array; 32 }
实现代码:
1 NSArray *array = [self arrayWithHTMLurl:urlString ChildTags:@"img" getAttributeName:@"src" separatorString:@"/" prefixString:@"upload" getName:@"src"]; 2 NSLog(@"array = %@", array);
输出结果:
以上方法经常使用,可以抽取封装成分类。操作比较灵活,可以根据自己的需求进行相应的更改。
若有不足之处,希望大神多多指正。