iOS中HTML的解析——Hpple

前言

iOS中,当我们需要解析xmlhtml时,我们可以使用libxml2来进行解析。但由于libxml2的api设计比较繁琐,使用起来并不方便。Hpple则是基于libxml2的oc库,使 我们可以用其方便地进行xmlhtml的解析。

使用方法

我们先来看看,我们需要解析的是什么样的对象。

NSString *htmlString  = @"<p style='color:blue;font-size:16px;'>Hell<font color='red'>o w</font>orld</p>";

这是一段普通的html,设置了一段文字的字体大小和颜色。我可以先看展示效果。

image.png

我们在解析这一段html时,希望得到的,是它的标签名,内容和属性。接下来看一下Hpple是如何帮我们完成这些的:

    NSString *htmlString  = @"<p style='color:blue;font-size:16px;'>Hell<font color='red'>o w</font>orld</p>";
    // 将html字符串转为NSData
    NSData *data = [htmlString dataUsingEncoding:NSUTF8StringEncoding];
    // 创建Hpple对象
    xpathParser = [[TFHpple alloc] initWithHTMLData:data];
    // 搜索XPath寻找标签
    NSArray *elements  = [xpathParser searchWithXPathQuery:@"//p"];
    // Output
    TFHppleElement *element = [elements objectAtIndex:0];
    NSLog(@"content:%@" , [element content]);
    NSLog(@"tagName:%@",[element tagName]);
    NSLog(@"attributes:%@",[element attributes]);    

我们搜索文本中的<p>获得如下输出:

2018-03-03 19:29:01.249456+0800 HppleDemo[8877:1175700] content:Hello world
2018-03-03 19:29:01.249579+0800 HppleDemo[8877:1175700] tagName:p
2018-03-03 19:29:01.249743+0800 HppleDemo[8877:1175700] attributes:{
    style = "color:red;font-size:16px;";
}

这些输出中,我们获得了<p>的标签名、内容和style。但我们没有获取到<font>的信息。 所幸Hpple为我们提供了hasChildrenchildren两个方法,我们可以以此来获得子标签的属性:

    NSString *htmlString  = @"<p style='color:blue;font-size:16px;'>Hell<font color='red'>o w</font>orld</p>";
    // 将html字符串转为NSData
    NSData *data = [htmlString dataUsingEncoding:NSUTF8StringEncoding];
    // 创建Hpple对象
    xpathParser = [[TFHpple alloc] initWithHTMLData:data];
    // 搜索XPath寻找标签
    NSArray *elements  = [xpathParser searchWithXPathQuery:@"//p"];
    // Output
    TFHppleElement *element = [elements objectAtIndex:0];
    [self logElemen:element];
    if ([element hasChildren]) {
        NSArray* children = [element children];
        for(int i = 0 ; i < [children count] ; i++){
            TFHppleElement *subElement = children[i];
            [self logElemen:subElement];
        }
    }

- (void) logElemen:(TFHppleElement*) element{
    NSLog(@"raw:%@",[element raw]);
    NSLog(@"content:%@" , [element content]);
    NSLog(@"tagName:%@",[element tagName]);
    NSLog(@"attributes:%@",[element attributes]);
}

这样修改之后,我们可以看到<p>的子标签也被一一打印了出来:

2018-03-03 20:32:27.724729+0800 HppleDemo[9647:1226741] raw:<p style="color:blue;font-size:16px;">Hell<font color="red">o w</font>orld</p>
2018-03-03 20:32:27.724873+0800 HppleDemo[9647:1226741] content:Hello world
2018-03-03 20:32:27.724982+0800 HppleDemo[9647:1226741] tagName:p
2018-03-03 20:32:27.725157+0800 HppleDemo[9647:1226741] attributes:{
    style = "color:blue;font-size:16px;";
}
2018-03-03 20:32:27.725267+0800 HppleDemo[9647:1226741] raw:(null)
2018-03-03 20:32:27.725361+0800 HppleDemo[9647:1226741] content:Hell
2018-03-03 20:32:27.725464+0800 HppleDemo[9647:1226741] tagName:text
2018-03-03 20:32:27.725553+0800 HppleDemo[9647:1226741] attributes:{
}
2018-03-03 20:32:27.726085+0800 HppleDemo[9647:1226741] raw:<font color="red">o w</font>
2018-03-03 20:32:27.726243+0800 HppleDemo[9647:1226741] content:o w
2018-03-03 20:32:27.726401+0800 HppleDemo[9647:1226741] tagName:font
2018-03-03 20:32:27.726551+0800 HppleDemo[9647:1226741] attributes:{
    color = red;
}
2018-03-03 20:32:27.726694+0800 HppleDemo[9647:1226741] raw:(null)
2018-03-03 20:32:27.739766+0800 HppleDemo[9647:1226741] content:orld
2018-03-03 20:32:27.739906+0800 HppleDemo[9647:1226741] tagName:text
2018-03-03 20:32:27.740002+0800 HppleDemo[9647:1226741] attributes:{
}

以上,就是Hpple的基本使用,如有问题,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

JavaScript之insertBefore()和自定义insertAfter()的用法。

在JS图片库的第五版开发完后http://www.cnblogs.com/GreenLeaves/p/5691797.html#js_Five_Version我...

1829
来自专栏xx_Cc的学习总结专栏

iOS-UITextField 全面解析iOS中UITextField 使用全面解析UITextField的代理方法通知UITextField 在storyboard 中设置属性

3646
来自专栏前端说吧

JS-DOM 综合练习-动态添加删除班级成绩表

3388
来自专栏阮一峰的网络日志

jQuery设计思想

jQuery是目前使用最广泛的javascript函数库。 据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库。微软公司甚至把jQue...

4606
来自专栏一“技”之长

iOS开发CoreAnimation解读之四——Layer层动画内容

        通过前几篇博客的介绍,我们可以了解到layer层可以设置许多与控件UI相关的属性,并且对于iOS开发,UIView层的属性是会映射到CALaye...

691
来自专栏向治洪

java的双缓冲技术

Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色。在Java游戏编程和动画编程中最常见的就是对于屏幕闪烁的处理。本文从J2SE的一个再现了屏幕闪...

2288
来自专栏java一日一条

谷歌新Logo如何做到只有305字节

谷歌换logo已经有一段时间了,对于更换Logo的问题,大家讨论的最多的是到底新老Logo哪个更好看。

762
来自专栏lonelydawn的前端猿区

h5小游戏——HitRocket

一.游戏介绍 游戏介绍: 不断有携带字母炸弹的火箭撞向地面,请根据火箭身上的字母敲击键盘,每一次对应的敲击会击落携带该字母的火箭并使得分加一,每一架火箭撞到地...

19610
来自专栏我的博客

GO获取表单元素

1.如果使用Form[“username”]获取表单元素需调用ParseForm(),获取到的是数组 2.如果使用FormValue会自动调用ParseFor...

34015
来自专栏前端小叙

一个非常好用的文字滚动的案例,鼠标悬浮可暂停

网上找了很多,万变不离其宗,写法核心都是一样的,在这里我给大家总结一下,可收藏备用。 html: <div class="scroll"> <ul cl...

2698

扫码关注云+社区