正则表达式抓取网页数据 制作iOS小词典

应用程序不一定要自己去提供数据,有现成的数据学会去用才好。

网络很大,各种搜索引擎每天到处爬。本文通过正则表达式抓取网站的数据来做一个小词典。

一、正则表达式的使用

1. 确定匹配方案,即pattern

2. 用pattern实例化NSRegularExpression

3. 用匹配方法开始匹配。

匹配一次:可以使用firstMatch方法

匹配多次:可以用matchs方法


正则表达式对照表:(在网上找到了一个很不错的表,正则表达式各个语言通用)

http://www.jb51.net/shouce/jquery1.82/regexp.html


下面是测试代码,能匹配出:xn4545945


[objc] view plain copy



  1. //测试正则表达式用的  
  2. - (void)findAnswerInHTMLTest {  
  3.     NSString *srcStr = @"http://blog.csdn.net/xn4545945";  
  4.       
  5.     NSString *pattern = @"xn[^\\s]*";  //匹配以xn开头的任何非空白字符  
  6.   
  7.     //实例化正则表达式,需要指定两个选项  
  8.     //NSRegularExpressionCaseInsensitive  忽略大小写  
  9.     //NSRegularExpressionDotMatchesLineSeparators 让.能够匹配换行  
  10.     NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators error:nil];  
  11.       
  12.     //匹配出结果集  
  13.     NSTextCheckingResult *checkResult = [regex firstMatchInString:srcStr options:NSMatchingReportCompletion range:NSMakeRange(0, srcStr.length)];  
  14.       
  15.     // 取出找到的内容.  
  16.     NSString *result = [srcStr substringWithRange:[checkResult rangeAtIndex:0]];  
  17.       
  18.     NSLog(@"数据为----->%@", result);  
  19. }  




二、抓取网页数据,并制作小词典

用海词作为查询词典抓取数据。http://dict.cn

直接在网址后面拼接查询词即可查询,如查询“hello”,即http://dict.cn/hello

查看网页源代码如下图: 即抓取出 (打招呼)喂;你好 即可。



tips


(.*?)来取出想要的内容.括号括住才能取出.抓网页用这个就够了.

*. 表示匹配任意字符

**表示重复0到多次

*?  表示尽量少的匹配.

*需要取出的(.*?)代替.大空格换行等用.*?代替,表示忽略.


结合浏览器的查找功能, 在源代码中查找,看选取的关键词是否有重复的.(找时更方便)

*选取稍微大点的块(标签中有id标记的为好),可以做到唯一.(如果选太小,可能一些小标签在网页中重复的次数非常多)

*然后多次调用正则表达式方法,逐步缩小范围.

*引号需要转义(加反斜杠).中文需要%转义.(用方法)


直接上代码:

[objc] view plain copy



  1. @implementation XNSpider  
  2. - (void)loadHTMLWithWord:(NSString *)word {  
  3.     //1.发送HTML请求, 得到返回的网页.(转换为字符串)  
  4.     NSString *urlString = [NSString stringWithFormat:@"%@%@", kBaseURL, word];  //拼接请求网址  
  5.     urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //中文转义  
  6.     NSURL *url = [NSURL URLWithString:urlString];  //得到URL  
  7.   
  8.     NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0f];  
  9.   
  10.     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler: ^(NSURLResponse *response, NSData *data, NSError *connectionError) {  
  11.         //得到的data数据转换为字符串  
  12.         NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  13. //      NSLog(@"%@", html);  
  14.   
  15.         //2.从返回的字符串中匹配出(正则表达式过滤)想要的. (另写一个方法findAnswerInHTML)  
  16.         //然后通过代理传递结果给主线程,用于更新UI  
  17.   
  18.         NSString *result = [self findAnswerInHTML:html];  
  19.         NSLog(@"%@", result);  
  20.   
  21.         if ([self.delegate respondsToSelector:@selector(finishSpider:)]) {  
  22.             [self.delegate finishSpider:result]; //将完成后的结果通过代理传到UI线程中去.  
  23.         }  
  24.     }];  
  25. }  
  26.   
  27. /** 
  28.  *  正则表达式匹配字符串的核心方法 
  29.  * 
  30.  *  @param html 输入的整个网页字符串 
  31.  * 
  32.  *  @return 返回匹配的结果 
  33.  */  
  34. - (NSString *)findAnswerInHTML:(NSString *)html {  
  35.     //将需要取出的用(.*?)代替. 大空格换行等用.*?代替,表示忽略.  
  36.     NSString *pattern = @"<ul class=\"dict-basic-ul\">.*?<li><span>(.*?)</span><strong>(.*?)</strong></li>";  
  37.   
  38.     //实例化正则表达式,需要指定两个选项  
  39.     //NSRegularExpressionCaseInsensitive  忽略大小写  
  40.     //NSRegularExpressionDotMatchesLineSeparators 让.能够匹配换行  
  41.     NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators error:nil];  
  42.   
  43.     //匹配出结果集  
  44.     NSTextCheckingResult *checkResult = [regex firstMatchInString:html options:NSMatchingReportCompletion range:NSMakeRange(0, html.length)];  
  45.   
  46.     // 取出找到的内容. 数字分别对应第几个带括号(.*?), 取0时输出匹配到的整句.  
  47.     NSString *result = [html substringWithRange:[checkResult rangeAtIndex:2]];  
  48.   
  49.     NSLog(@"数据为----->%@", result);  
  50.     return result;  
  51. }  


匹配结果最后使用代理传到主线程中去更新UI。

程序界面如下:(查询Android后,从网页中找到的数据为“机器人”)



出错处理这里就不做了。



程序源码如下:http://download.csdn.net/detail/xn4545945/7619349

转载请注明出处:http://blog.csdn.net/xn4545945  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值