【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  


转载于:https://www.cnblogs.com/ldxsuanfa/p/10965596.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值