zoukankan      html  css  js  c++  java
  • 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);

    输出结果:

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

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

  • 相关阅读:
    jQuery validator plugin之Selector
    jQuery validator plugin之Methods
    jQuery validator plugin之Plugin Method
    jQuery validator plugin之概要
    jQuery validator plugin 之 custom methods 案例1:multi email
    实体关系图应用——google ads
    Google advertiser api开发概述——入门指南
    Google advertiser api开发概述——部分失败
    Google advertiser api开发概述——批量处理
    oogle advertiser api开发概述——速率限制
  • 原文地址:https://www.cnblogs.com/sjxjjx/p/5362665.html
Copyright © 2011-2022 走看看