【iOS】正则表达式抓取网页数据制作小词典

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

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

一、正则表达式的使用

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://download.csdn.net/detail/xn4545945/7619349

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

【iOS】正则表达式抓取网页数据制作小词典,布布扣,bubuko.com

时间: 2024-08-02 02:49:09

【iOS】正则表达式抓取网页数据制作小词典的相关文章

iOS开发——网络使用技术OC篇&amp;网络爬虫-使用正则表达式抓取网络数据

网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看看网络爬虫的基本原理: 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中.

java抓取网页数据,登录之后抓取数据。

最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一个jsoup的jar包,我用的1.6.0..下载地址为:http://pan.baidu.com/s/1mgqOuHa 1,获取网页内容(核心代码,技术有限没封装). 2,登录之后抓取网页数据(如何在请求中携带cookie). 3,获取网站的ajax请求方法(返回json). 以上这三点我就用一个类

用正则表达式抓取网页中的ul 和 li标签中最终的值!

获取你要抓取的页面 const string URL = "http://www.hn3ddf.gov.cn/price/GetList.html?pageno=1";            string htmlStr = null;            for (int i = 0; i < 10; i++)            {                try                {                    System.Net.Http

Asp.net 使用正则和网络编程抓取网页数据(有用)

Asp.net 使用正则和网络编程抓取网页数据(有用) /// <summary> /// 抓取网页对应内容 /// </summary> /// <param name="strUrl">採集地址</param> /// <param name="Begin">開始字符</param> /// <param name="End">结束字符</param&g

Asp.net 使用正则和网络编程抓取网页数据(实用)

Asp.net 使用正则和网络编程抓取网页数据(实用) /// <summary> /// 抓取网页相应内容 /// </summary> /// <param name="strUrl">采集地址</param> /// <param name="Begin">开始字符</param> /// <param name="End">结束字符</param&g

scrapy递归抓取网页数据

scrapy spider的parse方法可以返回两种值:BaseItem,或者Request.通过Request可以实现递归抓取. 如果要抓取的数据在当前页,可以直接解析返回item(代码中带**注释的行直接改为yield item): 如果要抓取的数据在当前页指向的页面,则返回Request并指定parse_item作为callback: 如果要抓取的数据当前页有一部分,指向的页面有一部分(比如博客或论坛,当前页有标题.摘要和url,详情页面有完整内容)这种情况需要用Request的meta

使用HtmlAgilityPack批量抓取网页数据

[转]使用HtmlAgilityPack批量抓取网页数据 相关软件点击下载 登录的处理.因为有些网页数据需要登陆后才能提取.这里要使用ieHTTPHeaders来提取登录时的提交信息. 抓取网页  HtmlAgilityPack.HtmlDocument htmlDoc;            if (!string.IsNullOrEmpty(登录URL))            {                htmlDoc = htmlWeb.Load(登录URL, 提交的用户验证信息,

【.NET】使用HtmlAgilityPack抓取网页数据

原文:[.NET]使用HtmlAgilityPack抓取网页数据 刚刚学习了XPath路径表达式,主要是对XML文档中的节点进行搜索,通过XPath表达式可以对XML文档中的节点位置进行快速定位和访问,html也是也是一种类似于xml的标记语言,但是语法没有那么严谨,在codeplex里有一个开源项目HtmlAgilityPack,提供了用XPath解析HTML文件,下面掩饰如何使用该类库的使用 首先说下XPath路径表达式 XPath路径表达式 用来选取XML文档中的节点或节点集的 1.术语:

抓取网页数据

项目说明:[抓取网页数据] 项目介绍:采集指定网页内容,通过模式匹配匹配到要采集的数据格式返回到数组中 项目步骤:1.创建匹配模式表2.请求网页连接3.过滤文本,并对数据去重处理4.显示结果 效果展示: 完整代码: import console; /* 项目说明:[抓取网页数据] 项目介绍: 采集指定网页内容,通过模式匹配匹配到要采集的数据格式返回到数组中 项目步骤: 1.创建匹配模式表 2.请求网页连接 3.过滤文本,并对数据去重处理 4.显示结果 */ //参考来源:http://bbs.a