• 【iOS】正則表達式抓取网页数据制作小词典


    版权声明:本文为博主原创文章,未经博主同意不得转载。

    https://blog.csdn.net/xn4545945/article/details/37684127

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

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

    一、正則表達式的使用

    1. 确定匹配方案,即pattern

    2. 用pattern实例化NSRegularExpression

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

    匹配一次:能够使用firstMatch方法

    匹配多次:能够用matchs方法


    正則表達式对比表:(在网上找到了一个非常不错的表,正則表達式各个语言通用)

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


    以下是測试代码。能匹配出:xn4545945

    //測试正則表達式用的
    - (void)findAnswerInHTMLTest {
        NSString *srcStr = @"http://blog.csdn.net/xn4545945";
        
        NSString *pattern = @"xn[^\s]*";  //匹配以xn开头的不论什么非空白字符
    
    	//实例化正則表達式,须要指定两个选项
    	//NSRegularExpressionCaseInsensitive  忽略大写和小写
    	//NSRegularExpressionDotMatchesLineSeparators 让.能够匹配换行
    	NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators error:nil];
        
    	//匹配出结果集
    	NSTextCheckingResult *checkResult = [regex firstMatchInString:srcStr options:NSMatchingReportCompletion range:NSMakeRange(0, srcStr.length)];
        
    	// 取出找到的内容.
    	NSString *result = [srcStr substringWithRange:[checkResult rangeAtIndex:0]];
        
    	NSLog(@"数据为----->%@", result);
    }


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

    用海词作为查询词典抓取数据。

    http://dict.cn

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

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



    tips

    (.*?)来取出想要的内容.括号括住才干取出.抓网页用这个就够了.
    *. 表示匹配随意字符
    **表示反复0到多次
    *?

      表示尽量少的匹配.

    *须要取出的(.*?)取代.大空格换行等用.*?

    取代,表示忽略.


    结合浏览器的查找功能, 在源码中查找,看选取的关键词是否有反复.(找时更方便)
    *选取略微大点的块(标签中有id标记的为好),能够做到唯一.(假设选太小,可能一些小标签在网页中反复的次数非常多)
    *然后多次调用正則表達式方法,逐步缩小范围.
    *引號须要转义(加反斜杠).中文须要%转义.(用方法)

    直接上代码:
    @implementation XNSpider
    - (void)loadHTMLWithWord:(NSString *)word {
    	//1.发送HTML请求, 得到返回的网页.(转换为字符串)
    	NSString *urlString = [NSString stringWithFormat:@"%@%@", kBaseURL, word];  //拼接请求网址
    	urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //中文转义
    	NSURL *url = [NSURL URLWithString:urlString];  //得到URL
    
    	NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0f];
    
    	[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler: ^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    	    //得到的data数据转换为字符串
    	    NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    //	    NSLog(@"%@", html);
    
    	    //2.从返回的字符串中匹配出(正則表達式过滤)想要的. (另写一个方法findAnswerInHTML)
    	    //然后通过代理传递结果给主线程,用于更新UI
    
    	    NSString *result = [self findAnswerInHTML:html];
    	    NSLog(@"%@", result);
    
    	    if ([self.delegate respondsToSelector:@selector(finishSpider:)]) {
    	        [self.delegate finishSpider:result]; //将完毕后的结果通过代理传到UI线程中去.
    		}
    	}];
    }
    
    /**
     *  正則表達式匹配字符串的核心方法
     *
     *  @param html 输入的整个网页字符串
     *
     *  @return 返回匹配的结果
     */
    - (NSString *)findAnswerInHTML:(NSString *)html {
    	//将须要取出的用(.*?

    )取代. 大空格换行等用.*?取代,表示忽略. NSString *pattern = @"<ul class="dict-basic-ul">.*?<li><span>(.*?)</span><strong>(.*?)</strong></li>"; //实例化正則表達式,须要指定两个选项 //NSRegularExpressionCaseInsensitive 忽略大写和小写 //NSRegularExpressionDotMatchesLineSeparators 让.能够匹配换行 NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators error:nil]; //匹配出结果集 NSTextCheckingResult *checkResult = [regex firstMatchInString:html options:NSMatchingReportCompletion range:NSMakeRange(0, html.length)]; // 取出找到的内容. 数字分别相应第几个带括号(.*?

    ), 取0时输出匹配到的整句. NSString *result = [html substringWithRange:[checkResult rangeAtIndex:2]]; NSLog(@"数据为----->%@", result); return result; }


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

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


    出错处理这里就不做了。


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


  • 相关阅读:
    3574. 乘积数量
    1357. 优质牛肋骨
    1356. 回文质数
    3554. 二进制
    13 vue路由跳转传参
    12 el-form的inline属性
    10 js数组赋值问题
    9 彻底搞懂json字符串和json对象
    8 element自定义卡槽的好处
    7 el-table表格中使用Dropdown 下拉菜单无法显示下拉框的问题
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10965596.html
  • Copyright © 2020-2023  润新知