注册 登录
主题 : 在objective-c中解析html
级别: 侠客

UID: 31227
精华: 0
发帖: 153
可可豆: 1116 CB
威望: 1116 点
在线时间: 878(时)
注册时间: 2010-09-19
最后登录: 2019-12-09
0 楼:  发表于: 2010-11-03 16:40    发自: Web Page

在objective-c中解析html    (在iOS代码库中浏览本帖)


#import "StringChuLi.h"
/*
项目作用:链接网络解析html
 */


@implementation StringChuLi


//访问网页源码
-(NSString *)urlString:(NSString *)value{
NSURL *url = [NSURL URLWithString:value];
NSData *data = [NSData dataWithContentsOfURL:url];  
//解决中文乱码,用GBK
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);    
NSString *retStr = [[NSString alloc] initWithData:data encoding:enc];
return retStr;
}
/*
 作用:截取从value1到value2之间的字符串
 str:要处理的字符串
 value1:左边匹配字符串
 value2:右边匹配字符串
 */
-(NSString *)str:(NSString *)str value1:(NSString *)value1 value2:(NSString *)value2{
//i:左边匹配字符串在str中的下标
int i;
//j:右边匹配字符串在str1中的下标
int j;
//该类可以通过value1匹配字符串
NSRange range1 = [str rangeOfString:value1];
//判断range1是否匹配到字符串
if(range1.length>0){
//把其转换为NSString
NSString *result1 = NSStringFromRange(range1);
i = [self indexByValue:result1];
//原因:加上匹配字符串的长度从而获得正确的下标
i = i+[value1 length];
}
//通过下标,删除下标以前的字符
NSString *str1 = [str substringFromIndex:i];
NSRange range2 = [str1 rangeOfString:value2];
if(range2.length>0){
NSString *result2 = NSStringFromRange(range2);
j = [self indexByValue:result2];
}
NSString *str2 = [str1 substringToIndex:j];
return str2;
}


//过滤获得的匹配信息的下标
-(int)indexByValue:(NSString *)str{
//使用NSMutableString类,它可以实现追加
NSMutableString *value = [[NSMutableString alloc] initWithFormat:@""];
NSString *colum2 = @"";
int j = 0;
//遍历出下标值
for(int i=1;i<[str length];i++){
NSString *colum1 = [str substringFromIndex:i];
[value appendString:colum2];
colum2 = [colum1 substringToIndex:1];
if([colum2 isEqualToString:@","]){
j = [value intValue];
break;
}
}
[value release];
return j;
}




@end



清空我的评分动态本帖最近评分记录: 共1条评分记录
nono 可可豆 +5 2010-12-12 -
隐藏评分记录
阵风吹来,樱花盛放,又一阵风吹过,花瓣蝶飞,花开花落,只是聚散一场,有一点欢喜,有一点悲戚。人间最美莫过如此:淋一场樱花雨,走一遭飘香路…
------------------------------------------ 这就是我们的红尘。
级别: 侠客

UID: 31227
精华: 0
发帖: 153
可可豆: 1116 CB
威望: 1116 点
在线时间: 878(时)
注册时间: 2010-09-19
最后登录: 2019-12-09
1 楼:  发表于: 2010-11-04 16:39    发自: Web Page
昨天发的那个有点小问题, 使用时请先查看网页编码格式,和要匹配的字符。
直接调用两个自定义的方法
步骤:
1、加载url
NSString *retStr = [self urlString:@"http://www.baidu.com/search/rss.html"];
2、匹配信息
sNSString *dataStr = [self str:retStr value1:@"<input name=\"text\" type=\"text\" value=\"" value2:@"\">"];
3、打印一下,看效果
NSLog(@"截到的值:%@",dataStr);
#import "StringChuLi.h"
/*
项目作用:解析html
*/

@implementation StringChuLi

//访问网站源码
-(NSString *)urlString:(NSString *)value{
    NSURL *url = [NSURL URLWithString:value];
    NSData *data = [NSData dataWithContentsOfURL:url];  
    //解决中文乱码,可以有很多编码格式,以你要抓取的网页编码格式为准
    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);    
    NSString *retStr = [[[NSString alloc] initWithData:data encoding:enc] autorelease];
    NSLog(@"获取到的值:%@",retStr);
    return retStr;
}
/*
作用:截取从value1到value2之间的字符串
str:要处理的字符串
value1:左边匹配字符串
value2:右边匹配字符串
返回值:需要的字符串
*/
-(NSString *)str:(NSString *)str value1:(NSString *)value1 value2:(NSString *)value2{
    //i:左边匹配字符串在str中的下标
    int i;
    //j:右边匹配字符串在str1中的下标
    int j;
    //该类可以通过value1匹配字符串
    NSRange range1 = [str rangeOfString:value1];
    //判断range1是否匹配到字符串
    if(range1.length>0){
        //把其转换为NSString
        NSString *result1 = NSStringFromRange(range1);
        i = [self indexByValue:result1];
        //原因:加上匹配字符串的长度从而获得正确的下标
        i = i+[value1 length];
    }else {
        return @"";
    }

    //通过下标,删除下标以前的字符
    NSString *str1 = [str substringFromIndex:i];
    NSRange range2 = [str1 rangeOfString:value2];
    if(range2.length>0){
        NSString *result2 = NSStringFromRange(range2);
        j = [self indexByValue:result2];
    }else {
        return @"";
    }

    NSString *str2 = [str1 substringToIndex:j];
    return str2;
}

/*
str:得到的range类的集合
过滤获得的匹配信息
返回值:返回下标
*/
-(int)indexByValue:(NSString *)str{
    //使用NSMutableString类,它可以实现追加
    NSMutableString *value = [[NSMutableString alloc] initWithFormat:@""];
    NSString *colum2 = @"";
    int j = 0;
    //遍历出下标值
    for(int i=1;i<[str length];i++){
        NSString *colum1 = [str substringFromIndex:i];
        [value appendString:colum2];
        colum2 = [colum1 substringToIndex:1];
        if([colum2 isEqualToString:@","]){
            j = [value intValue];
            break;
        }
    }
    [value release];
    return j;
}


@end
阵风吹来,樱花盛放,又一阵风吹过,花瓣蝶飞,花开花落,只是聚散一场,有一点欢喜,有一点悲戚。人间最美莫过如此:淋一场樱花雨,走一遭飘香路…
------------------------------------------ 这就是我们的红尘。
级别: 新手上路
UID: 36893
精华: 0
发帖: 27
可可豆: 270 CB
威望: 270 点
在线时间: 56(时)
注册时间: 2010-11-05
最后登录: 2011-08-19
2 楼:  发表于: 2010-11-16 17:50    发自: Web Page
谢谢楼主!

级别: 精灵王

UID: 15868
精华: 1
发帖: 499
可可豆: 3927 CB
威望: 4087 点
在线时间: 3304(时)
注册时间: 2010-03-21
最后登录: 2018-10-23
3 楼:  发表于: 2010-12-11 11:45    发自: Web Page
谢谢 楼主 不错蛮好用的
级别: 圣骑士

UID: 2406
精华: 1
发帖: 139
可可豆: 8145 CB
威望: 8145 点
在线时间: 1406(时)
注册时间: 2009-02-25
最后登录: 2015-08-25
4 楼:  发表于: 2010-12-12 13:51    发自: Web Page
如果用js来写,其实简单多了,js可以将结果传回oc的。
The greatest test of courage on earth is to bear defeat without losing heart.
级别: 禁止发言
UID: 30630
精华: 0
发帖: 566
可可豆: 5201 CB
威望: 5201 点
在线时间: 1955(时)
注册时间: 2010-09-14
最后登录: 2017-12-08
5 楼:  发表于: 2010-12-23 13:32    发自: Web Page
用户被禁言,该主题自动屏蔽!
级别: 精灵王
UID: 24120
精华: 0
发帖: 617
可可豆: 5004 CB
威望: 5004 点
在线时间: 548(时)
注册时间: 2010-07-07
最后登录: 2018-10-26
6 楼:  发表于: 2010-12-26 15:42    发自: Web Page
  
级别: 精灵王
UID: 24120
精华: 0
发帖: 617
可可豆: 5004 CB
威望: 5004 点
在线时间: 548(时)
注册时间: 2010-07-07
最后登录: 2018-10-26
7 楼:  发表于: 2011-02-15 09:47    发自: Web Page
学习乐
级别: 侠客
状态: 连续签到 - [8天]
UID: 17522
精华: 0
发帖: 131
可可豆: 1193 CB
威望: 1156 点
在线时间: 210(时)
注册时间: 2010-04-13
最后登录: 2014-09-02
8 楼:  发表于: 2011-02-15 21:54    发自: Web Page
謝謝樓主共享
级别: 新手上路
UID: 49078
精华: 0
发帖: 6
可可豆: 60 CB
威望: 60 点
在线时间: 5(时)
注册时间: 2011-01-30
最后登录: 2011-03-07
9 楼:  发表于: 2011-02-16 15:29    发自: Web Page
mark..........

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部