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

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  

【iOS】正則表達式抓取网页数据制作小词典的更多相关文章

  1. iOS正則表達式(一)

    什么是正則表達式? 正則表達式是对字符串操作的一种逻辑公式. 作用? 在iOS开发中我们通常使用正則表達式来匹配给定的字符串是否符合我们的业务逻辑,比方说用户注冊帐号仅仅能是手机号或者邮箱等.我们还能 ...

  2. ios 正則表達式替换

    1. 不可变字符串   (content 是不可变) NSRegularExpression *regularExpression = [NSRegularExpression regularExpr ...

  3. iOS_正則表達式

    iOS 正則表達式 正則表達式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE).计算机科学的一个概念. 正則表達式使用单个字符 ...

  4. python 学习笔记 10 -- 正則表達式

    零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...

  5. Python学习笔记8:标准库之正則表達式

    Python拥有强大的标准库.从如今起,開始学习标准库中提供的一些经常使用功能. 首先看正則表達式(regular expression),它的主要功能是从字符串(string)中通过特定的模式(pa ...

  6. Python——正則表達式(2)

    本文译自官方文档:Regular Expression HOWTO 參考文章:Python--正則表達式(1) 全文下载 :Python正則表達式基础 ======================== ...

  7. PHP第九课 正則表達式在PHP中的使用

    今天内容 1.正則表達式 2.数学函数 3.日期函数 4.错误处理 正則表達式: 1.模式修正符 2.五个经常使用函数 另外一个正則表達式的站点:http://www.jb51.net/tools/z ...

  8. 网页抓取信息(php正則表達式、php操作excel)

    1.问题描写叙述 实现对固定网页上自己须要的信息抓取,以表格形式存储. 我是拿wustoj上的一个排行榜来练习的,地址:wustoj 2.思路 网页自己就简单学习了一下php,刚好用它来做点事情吧,我 ...

  9. 深入浅出理解iOS经常使用的正則表達式—基础篇[Foundation]

    參考资料:cocoachina的zys475481075的文章 几个单词 Regular ['regjʊlə]adj. 定期的:有规律的 Expression[ɪk'spreʃ(ə)n; ek-] n ...

随机推荐

  1. win10下MYSQL 8.0.16的下载、安装以及配置

    win10系统MySQL 8.0的下载安装超详细教程 https://blog.csdn.net/qq_34444097/article/details/82315587 下载安装配置链接:https ...

  2. Codeforces 343D Water Tree & 树链剖分教程

    原题链接 题目大意 给定一棵根为1,初始时所有节点值为0的树,进行以下三个操作: 将以某点为根的子树节点值都变为1 将某个节点及其祖先的值都变为0 *询问某个节点的值 解题思路 这是一道裸的树链剖分题 ...

  3. STCubeMX软件新建Keil和IAR工程使用步骤:

    STCubeMX软件新建Keil和IAR工程使用步骤:首先是软件下载(也可在我们的百度云下载):1.STCubeMX下载地址:    http://www.stmicroelectronics.co ...

  4. JavaWeb-SpringBoot_使用MySQL数据库实现用户管理_demo

    使用Gradle编译项目 传送门 项目已托管到Github上 传送门 SpringBoot使用MySQL实现 实现功能:普通用户注册.普通用户登录.管理员通过edit-user页面和show-all- ...

  5. Vue中computed(计算属性)、methods、watch的区别

    实现效果:字符串的动态拼接 methods方法 html: <div id="app"> <!-- 监听到文本框数据的改变 --> <input ty ...

  6. 记一次elastic-job使用

    当当的elastic-job定时任务 业务场景是定时从微信取accesstoken和jsticket,因为都只有7200秒的有效时间,所以设置了定时任务,定时将得到的数据存到redis缓存中 问题1: ...

  7. python学习---50行代码实现图片转字符画2

    from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<> ...

  8. sql server中 设置与查看锁的超时时间(ZT) @@LOCK_TIMEOUT

      在数据库的应用系统中,死锁是不可避免的.通过设置死锁的处理优先级方法,可以在数据库引擎中自动检测到死锁,对发生的死锁会话进行干预,从而达到解除死锁的目点,但在这种情况下,会话只能被动的等待数据库引 ...

  9. T83310 【音乐会】二重变革

    T83310 [音乐会]二重变革 题解 你看数据那么大,又是一道数学题 题面描述这么个代码肯定不能傻fufu的直接把代码提交上去 我批评我自己 观察代码当中有一行 也就是说明最后这个数列都将变成同一个 ...

  10. Icon 图标

    Icon 图标 提供了一套常用的图标集合. ¶使用方法 直接通过设置类名为 el-icon-iconName 来使用即可.例如: <i class="el-icon-edit" ...