iOS 解析 html

在iOS开发中,app数据的来源,有可能是通过解析html。我一般是通过使用hpple三方库,来解析自己想要的数据。以下以解析新浪股票的某个模块为例,简单展示一下hpple的使用。

1. hpple的安装 

查询了一下hpple的版本信息,然后通过pod 将其集成到工程中。

2. 要解析的内容

解析的网址链接为 https://finance.sina.com.cn/stock/ ,下边红色框内为解析时显示的内容。我们要获取到每条新闻的标题、时间以及该条新闻对应的详情链接。

3. 解析流程

3.1 下边的代码片段即为以上新闻对应的html 部分(html格式都是一样的,为了避免代码片段太长,我将姚记扑克这条新闻之后的4条内容删除了)

<ul class="list04">
    <li>
        <span>17:39</span>
        <p>
            <a target="_blank" title="光洋股份股东称减持不超过5.71% 此前11天10涨停" href="https://finance.sina.com.cn/stock/s/2018-11-22/doc-ihmutuec2669357.shtml">光洋股份股东称减持不超过5.71% 此前11天10涨停</a>
        </p>
    </li>
    <li>
        <span>17:25</span>
        <p>
            <a target="_blank" title="银河承销首单纾困私募债 特锐德控股股东获4亿" href="https://finance.sina.com.cn/stock/s/2018-11-22/doc-ihpevhck1477054.shtml">银河承销首单纾困私募债 特锐德控股股东获4亿</a>
        </p>
    </li>
    <li>
        <span>16:20</span>
        <p>
            <a target="_blank" title="11月22日上市公司晚间公告速递" href="https://finance.sina.com.cn/stock/s/2018-11-22/doc-ihmutuec2643347.shtml">11月22日上市公司晚间公告速递</a>
        </p>
    </li>
    <li>
        <span>16:05</span>
        <p>
            <a target="_blank" title="苏常柴A:近日出售江苏银行1000万股股票" href="https://finance.sina.com.cn/stock/s/2018-11-22/doc-ihpevhck1324957.shtml">苏常柴A:近日出售江苏银行1000万股股票</a>
        </p>
    </li>
    <li>
        <span>16:00</span>
        <p>
            <a target="_blank" title="正业科技收关注函 要求就利润分配预案等进行说" href="https://finance.sina.com.cn/stock/s/2018-11-22/doc-ihpevhck1312223.shtml">正业科技收关注函 要求就利润分配预案等进行说</a>
        </p>
    </li>
    <li>
        <span>15:33</span>
        <p>
            <a target="_blank" title="15亿买微信公号失败后 骅威文化实控人立即甩卖" href="https://finance.sina.com.cn/stock/s/2018-11-22/doc-ihmutuec2626264.shtml">15亿买微信公号失败后 骅威文化实控人立即甩卖</a>
        </p>
    </li>
</ul>

3.2 解析环节

// 解析股票新闻
- (void)parseStockNews {
    
    // 根据链接获取对应的 NSData 数据
    NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"https://finance.sina.com.cn/stock/"]];
    
    // 根据data创建TFHpple实例
    TFHpple *doc = [[TFHpple alloc] initWithHTMLData:data];
    
    // 根据标签进行过滤
    NSArray *elements = [doc searchWithXPathQuery:@"//ul[@class='list04']"];
    
    // 循环查找子节点
    for (int i = 0; i < elements.count; i++) {
        
        // 获取单个ul节点
        TFHppleElement *ulE = [elements objectAtIndex:i];
        
        // 查找该ul节点下边名称为li的子节点
        NSArray *liArr = [ulE childrenWithTagName:@"li"];
        
        // 遍历获取到的所有li子节点
        for (TFHppleElement *liE in liArr) {
            
            // 每个li节点下边的第一个子节点为时间信息
            TFHppleElement *timeE = liE.firstChild;
            
            // 获取到时间
            NSString *timeStr = [timeE text];
            
            // 查找li节点下边的p节点,因为就一个p节点,所有我们取第一个p节点
            TFHppleElement *pE = [[liE childrenWithTagName:@"p"] firstObject];
            
            // p节点有一个a子节点,所以我们取到a节点
            TFHppleElement *aE = [[pE childrenWithTagName:@"a"] lastObject];
            
            // a节点的内容为 标题
            NSString *titleStr = [aE text];
            
            // 根据a节点的href属性,获取到具体的新闻链接地址
            NSString *urlStr = [aE objectForKey:@"href"];
            
            if (!timeStr || !urlStr || !titleStr) {
                continue;
            }
            NSLog(@"Stock News:\n时间:%@\n标题:%@\n链接:%@\n",timeStr,titleStr,urlStr);
        }
    }
}

4. 总结

我个人感觉 hpple 真的挺好用的,不过在使用过程中,还是要注意一些问题。比如,

4.1 有的html 节点内容或者属性值为空,这就会导致解析到的内容为空,针对这种情况,在解析的过程中,我们要对解析的结果进行相应的空判断,做到从数据源去除脏数据。

4.2 有的html 格式不是很规范,这样在解析具体节点内容时,会导致读取失败的情况,进而引发crash问题。当然,如果是html 是从后台返回的数据,那么最好是让后台将格式规范化;如果是扒的网页数据,那只能是自己多测测,在发现问题的地方,加以判断,具体问题具体分析。

4.3  因为以上新闻内容是随着时间变化的,所以要学会举一反三。

5. 我在demo 里边,一共解析了三种链接(以上链接包括在内),如有兴趣可以查看。
Demo 地址 https://github.com/coolpeng/HppleParseHtml

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值