专栏首页移动开发面面观iOS中HTML的解析——Hpple

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 条评论
登录 后参与评论

相关文章

  • KMP算法详解

    KMP是字符串匹配的经典算法。其中包含的思想,是非常有趣的。本文作为KMP算法的介绍和备忘录。

    Oceanlong
  • OpenGL ES——打光

    Oceanlong
  • okhttp——任务模型

    okhttp是Android中应用最广的http网络请求框架。结构优雅,性能强大。我们通过阅读它,对网络库的架构进行学习。

    Oceanlong
  • 大数据时代的弄潮儿

    “如今的贵州是中国南方数据中心,而我又主攻计算机的‘算法’,所以我来了。”法国南布列塔尼大学博士柯贵耀说,贵州是实现梦想的沃土。 柯贵耀曾受邀参加了2015贵...

    灯塔大数据
  • 人工智能的算法黑箱与数据正义

    一个月前,《终极算法》作者、人工智能著名学者、华盛顿大学教授PedroDomingos在社交网络中写道:“自5月25日起,欧盟将会要求所有算法解释其输出原理,这...

    小莹莹
  • 【Elasticsearch系列之四】腾讯云ES数据基本操作

    注意:本教程提供的示例代码仅适用于腾讯云Elasticsearch 7.x版本,不确定是否适用于其他版本,其他版本的示例代码请参见官方文档:https://ww...

    Vicwan
  • 人工智能的算法黑箱与数据正义

    【导读】许可:人工智能的算法依赖于大数据,而大数据并非中立。它们从真实社会中抽取,必然带有社会固有的不平等、排斥性和歧视的痕迹。 ? 一个月前,《终极算法》作者...

    WZEARW
  • 苹果隐私数据保护被质疑;可口可乐借大数据巩固市场地位 | DT数读

    过去一周,国际、国内的大数据相关公司都有哪些值得关注的新闻?数据行业都有哪些新观点和新鲜事?DT君为你盘点解读。

    DT数据侠
  • sqlacodegen:通过mysql语句生成sqlalchemy的model

    引用网页描述:这个工具读取现有数据库的结构并生成相应的SQLAlchemy模型代码。

    用户1558882
  • 【CTO讲堂】OpenStack行业实践和发展趋势探讨

    为了帮助IT从业者职业之路拥有更多收获,在诸多C粉的殷切期待下,由CTO俱乐部打造的CTO线上讲堂自登场以来获得大家好评。本期邀请EasyStack联合创始人兼...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券