应用程序不一定要自己去提供数据,有现成的数据学会去用才好。
网络很大,各种搜索引擎每天到处爬。本文通过正则表达式抓取网站的数据来做一个小词典。
一、正则表达式的使用
1. 确定匹配方案,即pattern
2. 用pattern实例化NSRegularExpression
3. 用匹配方法开始匹配。
匹配一次:可以使用firstMatch方法
匹配多次:可以用matchs方法
正则表达式对照表:(在网上找到了一个很不错的表,正则表达式各个语言通用)
http://www.jb51.net/shouce/jquery1.82/regexp.html
下面是测试代码,能匹配出:xn4545945
//测试正则表达式用的
- (void)findAnswerInHTMLTest {
NSString *srcStr = @"http://blog.youkuaiyun.com/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.youkuaiyun.com/xn4545945