WebView获取当前网页的页面元素
2016-03-13 01:55
441 查看
今天简单总结一下,如何通过WebView来获取Html的页面元素。
第一步,首先用WebView加载一个Html页面
先来看一下webView的几个代理
第二步,就可以在我们刚才所说的webViewDidFinishLoad方法中获取页面元素了
1.获取当前页面的title
第三,我们可以获取webView上面按钮的点击事件
UIWebView的协议里面有这么个方法,可以获取它加载的网页上面的事件,比如单击了图片,单击了按钮等等
这样写了之后,点击按钮之后就不会用当前的UIWebView来加载网络上的网页,而是调用系统的Safari来打开。
注意:最后一点要返回YES,否则UIWebView刚开始将一片空白,这是因为第一次加载的时候也是UIWebView请求一个链接,如果返回NO,就不会去加载了。还可以对url的内容进行判断,看是什么请求,然后再确定是否返回YES。
接口,如果为webView添加了delegate对象并实现该接口,那么在webView加载任何一个frame之前都会delegate对象的该方法,该方法的返回值用以控制是否允许加载目标链接页面的内容,返回YES将直接加载内容,NO则反之。并且UIWebViewNavigationType枚举,定义了页面中用户行为的分类,包括
UIWebViewNavigationTypeLinkClicked,用户触击了一个链接。
UIWebViewNavigationTypeFormSubmitted,用户提交了一个表单。
UIWebViewNavigationTypeBackForward,用户触击前进或返回按钮。
UIWebViewNavigationTypeReload,用户触击重新加载的按钮。
UIWebViewNavigationTypeFormResubmitted,用户重复提交表单
UIWebViewNavigationTypeOther,发生其它行为。
拼接的Html最后加的按钮的方法如下:
NSURL * path = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"source_page_button" ofType:@"png"]];
[strReturn appendString:[NSString stringWithFormat:@"<div style='display:block;text-align:center;margin:0 auto;'><a href='%@'><img src='%@'></a></div>",_url,path]];
获取点击的按钮的方法名
第一步,首先用WebView加载一个Html页面
NSString *str=@"http://.........";
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT-44)]; webView.delegate = self; NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:str]]; [self.view addSubview: webView]; [webView loadRequest:request];当然,可以在webView的加载过程中用我们自己的Loading....(在代理方法中实现)
先来看一下webView的几个代理
-(void)webViewDidStartLoad:(UIWebView *)webView { [[BKLoadingView shared] startLoading]; }要获取Html的元素,首先要等页面加载完成,就是主要在下面方法中实现
- (void)webViewDidFinishLoad:(UIWebView *)webView { [[BKLoadingView shared] endLoading]; //此处获取Html页面元素 }页面加载失败的代理
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { [[BKLoadingView shared] endLoading]; NSLog(@"错误信息:%@",[error localizedDescription]); if([error code] == NSURLErrorCancelled) { //页面还没有加载完成有发生其它情切或者加载其他页面 //这时会走这个方法报NSURLErrorCancelled -999错 //并不影响正常,所以加上这个就可以了 return; } }
第二步,就可以在我们刚才所说的webViewDidFinishLoad方法中获取页面元素了
1.获取当前页面的title
NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; //NSLog(@"页面title:%@",title);2.获取当前页面路径
NSString *currentURL = webView.request.URL.absoluteString; NSLog(@"currentURL===%@",currentURL);3.获取当前页面Html
NSString *lJs = @"document.documentElement.innerHTML"; NSString *currentHTML = [webView stringByEvaluatingJavaScriptFromString:lJs]; NSLog(@"currentHTML======%@",currentHTML);4.使用正则表达式,去掉html中的标签元素,获得纯文本
//content是根据网址获得的网页源码字符串(就是currentHTML) NSRegularExpression *regularExpretion=[NSRegularExpression regularExpressionWithPattern:@"<[^>]*>" options:0 error:nil]; //替换所有html和换行匹配元素为"-" content=[regularExpretion stringByReplacingMatchesInString:content options:NSMatchingReportProgress range:NSMakeRange(0,content.length) withTemplate:@"-"]; //根据正则表达式把多个"-"匹配为一个"-" regularExpretion=[NSRegularExpression regularExpressionWithPattern:@"-{1,}" options:0 error:nil] ; content=[regularExpretion stringByReplacingMatchesInString:content options:NSMatchingReportProgress range:NSMakeRange(0, content.length) withTemplate:@"-"]; //把\t和\n换成@"" regularExpretion=[NSRegularExpression regularExpressionWithPattern:@"\t|\n" options:0 error:nil] ; content=[regularExpretion stringByReplacingMatchesInString:content options:NSMatchingReportProgress range:NSMakeRange(0, content.length) withTemplate:@""]; //分成数组 NSArray *arr=[NSArray array]; content=[NSString stringWithString:content]; arr = [content componentsSeparatedByString:@"-"]; NSMutableArray *marr=[NSMutableArray arrayWithArray:arr]; for (NSString *str in arr) { NSString *str1=[str stringByReplacingOccurrencesOfString:@" " withString:@""]; if (str1.length==0) { [marr removeObject:str]; } } NSLog(@"marr===%@",marr);当然可以根据正则表达式自己随意替换,根据不同符号分组
第三,我们可以获取webView上面按钮的点击事件
UIWebView的协议里面有这么个方法,可以获取它加载的网页上面的事件,比如单击了图片,单击了按钮等等
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { //判断是否是单击 if (navigationType == UIWebViewNavigationTypeLinkClicked) { NSURL *url = [request URL]; if([[UIApplication sharedApplication]canOpenURL:url]) { [[UIApplication sharedApplication]openURL:url]; } return NO; } return YES; }
这样写了之后,点击按钮之后就不会用当前的UIWebView来加载网络上的网页,而是调用系统的Safari来打开。
注意:最后一点要返回YES,否则UIWebView刚开始将一片空白,这是因为第一次加载的时候也是UIWebView请求一个链接,如果返回NO,就不会去加载了。还可以对url的内容进行判断,看是什么请求,然后再确定是否返回YES。
接口,如果为webView添加了delegate对象并实现该接口,那么在webView加载任何一个frame之前都会delegate对象的该方法,该方法的返回值用以控制是否允许加载目标链接页面的内容,返回YES将直接加载内容,NO则反之。并且UIWebViewNavigationType枚举,定义了页面中用户行为的分类,包括
UIWebViewNavigationTypeLinkClicked,用户触击了一个链接。
UIWebViewNavigationTypeFormSubmitted,用户提交了一个表单。
UIWebViewNavigationTypeBackForward,用户触击前进或返回按钮。
UIWebViewNavigationTypeReload,用户触击重新加载的按钮。
UIWebViewNavigationTypeFormResubmitted,用户重复提交表单
UIWebViewNavigationTypeOther,发生其它行为。
拼接的Html最后加的按钮的方法如下:
NSURL * path = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"source_page_button" ofType:@"png"]];
[strReturn appendString:[NSString stringWithFormat:@"<div style='display:block;text-align:center;margin:0 auto;'><a href='%@'><img src='%@'></a></div>",_url,path]];
获取点击的按钮的方法名
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *url = request.URL.absoluteString; NSLog(@"url:%@",url); NSRange range = [url rangeOfString:@":"]; NSString *method = [request.URL.absoluteString substringFromIndex:range.location + 1]; NSLog(@"method:%@",method); return YES; }
相关文章推荐
- 开发笔记-UIApplication单例
- Android中Activity启动模式详解
- Android_自动安装APK
- Retrofit——Java(Android) 的REST 接口封装类库(相当于IOS中的restkit)
- Android_获取当前的版本号和版本名称,获取SIM卡的信息
- android四大组件(详细总结)
- 详解JS中的Object对象
- android学习 读书笔记之 android 绘图shape
- Android LineaLayout baselineAligned
- cocos2d-x之 利用富文本控件解析xhml标签(文字标签,图片标签,换行标签,标签属性)
- iOS证书自助管理实现思路
- cocos2dx 视频播放器
- AudioManger和AudioSystem的关系
- Android—将Bitmap图片保存到SD卡目录下或者指定目录
- Objective-C 类的复合
- AudioService 和AudioManager 以及使用举例.
- Android 中字符串的拆分--split的使用
- AndroidStudio下加入百度地图的使用(一)——环境搭建
- CoreImage 之 CIDetector iOS 人脸识别
- Swift语言工厂设计模式和抽象工厂设计模式