IOS之解析Html的两种方式

1.最近没什么做的就解析了html的文本来了,在解析的时候会遇到一些问题,但是现在也解决了, 我使用了两种方式去解析Html 页面,现在就来说一下是什么方式去解析的

第一种的方法:使用正则表达式(http://rss.sina.com.cn/sports/basketball/nba.xml 需要解析的数据)

使用多线程的方式去解析html数据:

-(void)getNews{

//使用多线程开发

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//请求的url

NSString *requestStr = @"http://rss.sina.com.cn/sports/global/focus.xml";

NSString *htmlStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:requestStr] encoding:NSUTF8StringEncoding error:nil];

dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程的方法

NSLog(@"call back the data is :%@",htmlStr);

[self updatview:htmlStr];

});

});

}

//<item>需要要解析的数据

//<title>

//<![CDATA[热身-世界波扳平后遭绝杀 AC米兰1-2客负里昂]]>

//</title>

//<link>http://go.rss.sina.com.cn/redirect.php?url=http://sports.sina.com.cn/g/seriea/2015-07-19/04407658051.shtml</link>

//<author>WWW.SINA.COM.CN</author>

//<guid>http://go.rss.sina.com.cn/redirect.php?url=http://sports.sina.com.cn/g/seriea/2015-07-19/04407658051.shtml</guid>

//<category>

//<![CDATA[国际足坛-焦点新闻]]>

//</category>

//<pubDate>Sat, 18 Jul 2015 20:40:57 GMT</pubDate>

//<comments>http://comment.news.sina.com.cn/cgi-bin/comment/comment.cgi?channel=gn&amp;newsid=6-12-4810592</comments>

//<description>

//<![CDATA[]]>

//</description>

//</item>

-(void)updatview:(NSString *)htmlStr{

//title的数据源

NSString *copy = htmlStr;

int start = 0;

while (YES) {

//从那个位置开始

htmlStr = [htmlStr substringFromIndex:start];

//设置一个标志

NSString *tag = @"CDATA\\[.*\\]";

//设定一个范围(正则表达式方法)

NSRange rang = [htmlStr rangeOfString:tag options:NSRegularExpressionSearch];

if (rang.length >0) {

NSString *find = [htmlStr substringWithRange:rang];

find = [[find stringByReplacingOccurrencesOfString:@"CDATA[" withString:@""]stringByReplacingOccurrencesOfString:@"]" withString:@""];

NSLog(@"find :%@",find);

start = (int)(rang.location +rang.length);

if ([find isEqualToString:@""]||[find isEqualToString:@"国际足坛-焦点新闻"]) {

continue;

}

else{

[self.titleArrray addObject:find];

}

}else{

break;

}

}

//urlArray

htmlStr = copy;

int start2  = 0;

while (YES) {

//1从那个位置开始

htmlStr = [htmlStr substringFromIndex:start2];

//2.设定一个tag

NSString *tag2 = @"<link>.*</link>";

//3.设定一个范围

NSRange rang2 = [htmlStr rangeOfString:tag2 options:NSRegularExpressionSearch];

if (rang2.length > 0) {

NSString *find2 = [htmlStr substringWithRange:rang2];

find2 = [[find2 stringByReplacingOccurrencesOfString:@"<link>" withString:@""]stringByReplacingOccurrencesOfString:@"</link>" withString:@""];

[self.urlArray addObject:find2];

NSLog(@"find2:%@",find2);

start2 = (int)(rang2.location +rang2.length);

}else {

break;

}

}

//timeArray

htmlStr = copy;

int start3 = 0;

while (YES) {

//1从那个位置开始

htmlStr = [htmlStr substringFromIndex:start3];

//2.设定一个tag

NSString *tag3 = @"<pubDate>.*</pubDate>";

//3.设定一个范围

NSRange rang3 = [htmlStr rangeOfString:tag3 options:NSRegularExpressionSearch];

if (rang3.length > 0) {

NSString *find3 = [htmlStr substringWithRange:rang3];

find3 = [[find3 stringByReplacingOccurrencesOfString:@"<pubDate>" withString:@""]stringByReplacingOccurrencesOfString:@"</pubDate>" withString:@""];

[self.dataArray addObject:find3];

NSLog(@"find2:%@",find3);

start3 = (int)(rang3.location +rang3.length);

}else {

break;

}

}

[self.titleArrray removeObjectAtIndex:0];

[self.titleArrray removeObjectAtIndex:0];

[self.titleArrray removeObjectAtIndex:0];

[self.urlArray removeObjectAtIndex:0];

[self.urlArray removeObjectAtIndex:0];

[self.urlArray removeObjectAtIndex:0];

[self.dataArray removeObjectAtIndex:0];

NSLog(@"%@,%@,%@" ,self.titleArrray , self.urlArray, self.dataArray);

[self.NewTableView reloadData];

}

第二中方式:(使用了第三方库TFHpple)

- (void)jiexi {

NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://rss.sina.com.cn/sports/basketball/nba.xml"]];

NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

TFHpple *doc=[[TFHpple alloc] initWithXMLData:data];

NSArray *items=[doc searchWithXPathQuery:@"//item"];

self.articles=[NSMutableArray array];

Article *aricle=nil;

for (TFHppleElement *item in items) {

aricle=[[Article alloc] init];

for (TFHppleElement *element in item.children) {

if ([@"title" isEqualToString:element.tagName]) {

aricle.title=element.content;

}else if ([@"link" isEqualToString:element.tagName]){

aricle.link=element.content;

}

}

[self.articles addObject:aricle.title];

}

}

在这里有问题了,我昨晚取到数据老是出不来,老师郁闷呀,原来是解析的数据里面好多的空格和换行了,要去掉换行就可以实现了数据的加载:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

return self.articles.count;

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

if (!cell) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

}

NSString * string = [self.articles objectAtIndex:indexPath.row];

NSString* headerData=string;

headerData = [headerData stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];  //去除掉首尾的空白字符和换行字符

headerData = [headerData stringByReplacingOccurrencesOfString:@"\r" withString:@""];

headerData = [headerData stringByReplacingOccurrencesOfString:@"\n" withString:@""];

cell.textLabel.text = headerData;

cell.textLabel.numberOfLines = 0;

return cell;

}

时间: 2024-09-28 12:40:14

IOS之解析Html的两种方式的相关文章

iOS程序编译打包的两种方式

这个选项其实是用来设置我们要如何打包我们的代码. Architectures: 项目要编译的目标设备列表, 设置以哪种方式打包我们的代码 第一种方式: 包含两种架构的代码包(32bit, 64bit), 但是这种打包方式只能运行在iOS6以上的系统, 也就是说这种打包方式, 对手机没有要求, 只是对系统有要求. 第二种方式: 只包含一种架构的代码(32bit), 这种打包方式, 对于手机和系统都没什么要求, 但是这样会降低64位系统的手机性能 如果要兼容iOS5以及更低的系统, 只能打32位的包

iOS 加载Image的两种方式

Apple官方文档对于加载image提供了两个方法 + (nullable UIImage *)imageNamed:(NSString *)name; + (nullable UIImage *)imageWithContentsOfFile:(NSString *)path; 那么这两个方法对于加载图片有什么区别呢,下面我们用序列帧动画来演示这两个方法的区别: 这个程序一共加载了三组序列帧动画: 首先我们使用+ (nullable UIImage *)imageNamed:(NSString

iOS拼接json字符串的两种方式

两种json字符串拼接的方法如下: + (NSString *)UIUtilsFomateJsonWithDictionary:(NSDictionary *)dic { NSArray *keys = [dic allKeys]; NSString *string = [NSString string]; for (NSString *key in keys) { NSString *value = [dic objectForKey:key]; value = [NSString strin

C#解析json的两种方式

C#中Json转换主要使用的几种方法! 这篇主要介绍2.4.第三种方法使用的比较局限,所以我没有深入学习. 第二种方法 我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A.利用serializer获取json的泛型对象 利用Dictionary<string,object>接收转换完的json对象,然后用查询泛型的指令即可提取想要的json对象. string JsonData = “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”; JavaScriptSeri

解析XML的两种方式 javax | dom4j

package xml; import java.io.IOException; import java.io.StringReader; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.DocumentException; public class Test { private static String xml = "<xml><ToUserNam

Android解析XML文档的两种方式的简单对比

Android之所以会用到解析XML文档,不仅与JAVA对XML的解析比较简单,而且还因为XML是Android在网络间传递信息的主要存储方式.下面我简单谈谈Android对XML文档解析的两种方式:dom和sax.dom解析方式是,解析方法将一个XML文件看成是一棵树.由数据结构的知识我们知道对树的处理比较简单,就是对树的节点进行增,删,改,查,这也是dom的一个最大优点.但是,dom方式在解析的时候是一次性就将整个XML文档读进内存,这坏处不用我说了吧,我宝贵的内存是禁不起这么折腾的. sa

iOS 自定义layer的两种方式

在iOS中,你能看得见摸得着的东西基本都是UIView,比如一个按钮,一个标签,一个文本输入框,这些都是UIView: 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个图层 @property(nonatomic,readonly,retain) CALayer *layer; 每一个UIView内部都默认关联一个CALayer,我们可称这个Laye

iOS中创建单例的两种方式

刚刚开始做iOS开发的时候,不知道怎么创建单例,在网上搜的也大多数都不太全,所以总结了一下创建单例的两种方式 首先在.h文件中声明类方法 1 +(instancetype)sharedUtils; 然后在.m文件中实现它,实现的方法有两种 第一种,在创建一个对象时先判断在程序中有没有创建过这个对象 1 static PublicUtils *DefaultManager = nil; 2 3 +(instancetype)sharedUtils 4 { 5 if (!DefaultManager

ios给NSMutableDictionary循环赋值的两种方式,在循环内初始化NSMutableDictionary和在循环外初始化NSMutableDictionary有何区别?(已解决)

NSMutableArray * arrayName = [NSMutableArray array]; NSMutableArray * array = [NSMutableArray array]; [array removeAllObjects]; for (int i = 0; i< 10; i++) { NSString * str = [NSString stringWithFormat:@"name%i",i]; [arrayName addObject:str];