使用TFHpple解析html

TFHpple

我们平时做一些iOS项目或者Demo的时候,都会遇到对一个html的页面进行加载。一半情况下,为了简单省事,我们会使用UIWebView对html页面进行加载,就算页面中有一些自己不满意的东西,也会通过UIWebView与js的交互,对页面的一些界面元素进行修改。但是除了用UIWebView,我们还可以使用TFHpple对html的数据进行解析,来完成我们的需求。下面就为大家介绍一下怎样使用TFHpple来解析一个html页面。

前期准备工作

引入静态库文件

1
在 targets->Build Phases->Link Binary With Libraries 中,添加 libxml2.2.dylib

添加库文件的 header search paths

1
在 project->Build Phases->Build Settings->Search Paths 中,添加 header search paths 路径 /usr/include/libxml2

将从github上下载的源码包(Hpple)拖入工程当中 (https://github.com/topfunky/hpple)

使用详情

我们来解析网址 http://living.mojichina.com/index/index/index/indexid/12/cityid/(null)/platform/iphone?appshare=1 中的title标签

1
2
3
4
5
6
<html>
<head>
<title>紫外线指数</title>
</head>

思路:1、将网页转换成NSData 2、按照标签值在NSData中数据进行查询 3、检索数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 一 获取html的NSData数据
NSString *urlStr = @"http://living.mojichina.com/index/index/index/indexid/12/cityid/(null)/platform/iphone?appshare=1";
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:urlStr]];
// 二 解析html数据
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
// 三 根据标签来进行过滤
NSArray *dataArray = [xpathParser searchWithXPathQuery:@"//title"];
// 四 开始整理数据
for (TFHppleElement *hppleElement in dataArray) {
// 打印出该节点所有的内容(包括标签)
NSLog(@"%@", hppleElement.raw);
// 打印出该节点所有内容(不包含标签)
NSLog(@"%@", hppleElement.text);
}

将网页中所有的摘要信息解析出来 只要你能清楚:节点、节点属性、节点属性值、节点的内容 剩下的事情就好办了

1
2
3
4
情况一:
<div class='BlogCopyright'>
声明:OSCHINA 博客文章版权属于作者,受法律保护。未经作者同意不得转载。
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 一 获取html的NSData数据
NSString *urlStr = @"http://my.oschina.net/rqm/blog/346833";
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:urlStr]];
// 二 解析html数据
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
// 三 根据标签来进行过滤
NSArray *dataArray1 = [xpathParser searchWithXPathQuery:@"//div"];
// 四 开始整理数据
for (TFHppleElement *hppleElement1 in dataArray1) {
// 过滤指定的数据
if ([[hppleElement1 objectForKey:@"class"] isEqualToString:@"BlogCopyright"]) {
NSLog(@"信息摘要:%@", hppleElement1.text);
}
}
1
2
3
4
5
6
7
情况二:
<div class="notice">
<p>温度范围:~℃</p>
<p>天气状况:</p>
<p>日出日落:/</p>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
// 一 获取html的NSData数据
NSString *urlStr = @"http://living.mojichina.com/index/index/index/indexid/12/cityid/(null)/platform/iphone?appshare=1";
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:urlStr]];
// 二 解析html数据
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
// 三 根据标签来进行过滤
NSArray *dataArray1 = [xpathParser searchWithXPathQuery:@"//div[@class='notice']/p"];
TFHppleElement *hppleElement = [dataArray1 objectAtIndex:0];
NSLog(@"%@", hppleElement.content);
1
2
情况三:
<li class="item control_select"><a href="http://www.oschina.net/project" class='project'>开源项目</a>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 一 获取html的NSData数据
NSString *urlStr = @"http://my.oschina.net/rqm/blog/346833";
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:urlStr]];
// 二 解析html数据
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
// 三 根据标签来进行过滤
NSArray *dataArray = [xpathParser searchWithXPathQuery:@"//a"];
// 四 检索数据
for (TFHppleElement *hppleElement in dataArray) {
if ([hppleElement.attributes[@"class"] isEqualToString:@"project"]) {
NSLog(@"%@", hppleElement.text);
}
}