iOS项目之解析HTML数据

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

输出结果:

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

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

原文地址:https://www.cnblogs.com/sjxjjx/p/5362665.html