【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);
}
二、抓取网页数据,并制作小词典
用海词作为查询词典抓取数据。
直接在网址后面拼接查询词就可以查询,如查询“hello”,即http://dict.cn/hello
查看网页源码例如以下图: 即抓取出 (打招呼)喂;你好 就可以。
tips:
表示尽量少的匹配.
取代,表示忽略.
@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。
转载请注明出处:http://blog.csdn.net/xn4545945