今天简单总结一下,如何通过WebView来获取Html的页面元素。

第一步,首先用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;
}

WebView获取当前网页的页面元素相关推荐

  1. appium 切换native/ webview,findby,还有页面元素定位一直小于0的问题的解决

    之前一直有个bug没有解决. 今天,终于解决了. 疑问过程: app是混合应用,项目做了H5优化之后,以前的用例执行总会失败,体现在原来的一个元素点击无反馈 排查原因:1.项目做了H5优化,2.测试的 ...

  2. 24种页面元素与iDo网页设计工具箱

    只要换成庖丁解牛的眼光来审视一个网站,就会发现网页是由视觉效果和显示内容构成的. 视觉效果包括网页的背景.区域的背景.各种装饰,而显示内容则包括各种类型的列表.文本内容.标题.图片.动画和幻灯片等,视 ...

  3. vc采集网页内所有元素(不指定具体table/form/frame)

    1.独立代码 //-----------开始---------------------// #include <atlbase.h> #include <mshtml.h> # ...

  4. mac 系统使用macaca inspector 获取iphone真机应用元素

    1.安装brew 软件包管理工具:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst ...

  5. JavaScript定位页面元素属性(满满的干货)

    Document对象提供了用来定位HTML页面中特殊元素的方法.跟小编一起来看看吧,保证让你稳赚. documentElement: 获取HTML页面中的<html>元素 head: 获取 ...

  6. python获取当前网页元素_Python+Selenium练习(三十)- 获取页面元素的href属性

    目标:通过Selenium获取页面元素的某一个属性.一个元素可能有多个属性,例如class,id,name,text,href,value等. 练习场景:找出当前页面的所有超链接.例:打印出百度首页所 ...

  7. selenium常用命令之操作页面元素及获取元素内容的事件整理

    /**id <input type="text" id="phone" name="phone" class="LoginT ...

  8. eclipse在网页进入时显示重定向过多_使用eclipse快速开发jsp以及编码问题、jsp页面元素、request对象学习的粗略记录...

    人老了真是什么都会忘记啊orz,早上发现学过去的东西好多都还没记录复盘... ...(懒虫作祟) 在开始之前,俺认为还是很有必要了解一下jsp的执行流程,俺发现CSDN上的"陈小哥cw&qu ...

  9. java 获取页面元素的位置_Selenium Java 页面元素定位2

    一.操作目的 1.1 自动化测试常用操作 1.定位网页上的元素,并存储到一个变量中: 2.对变量进行操作,比如点击或输入文字: 3.设定页面元素的操作值: 二.定位方法汇总 2.1 findEleme ...

最新文章

  1. 人类史上最伟大的 PPT,马斯克的 39 页火星计划PPT
  2. 组建一台计算机3_硬件3 多位运算器
  3. c#项目转JAVA,第5个月,基本完成
  4. 11.14/11.15 Apache和PHP结合 11.16/11.17 Apache默认虚拟主机
  5. 如何配置能让fiddler抓去https的请求?
  6. druid报异常 “sql injection violation, part alway true condition not allow”的解决方案
  7. UE3 预计算可见性
  8. android 触摸事件 控制,Android笔记:触摸事件的分析与总结----TouchEvent处理机制
  9. mysql服务器级别角色_服务器数据库系列 - MySQL事务隔离级别详解
  10. caffe 利用Python API 做数据输入层
  11. VMware Workstation 8.0 序列号
  12. linux使用客户端连接redis,使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题...
  13. 尾注参考文献之后添加附录致谢解决办法
  14. html粘性菜单,导航菜单:jQuery粘性滚动导航栏效果
  15. 初识 Mac机子 关机命令
  16. php 浏览器唯一标识符,在PHP中获取唯一的Web浏览器ID
  17. (初学者视角)二极管和三极管的工作原理
  18. 实现人生梦想,共同创造人生辉煌!
  19. 深入学习理解(1):java:ExecutorService invokeAll 任务的批量提交invokeAll两种方法的区别
  20. 电影《功夫熊猫2》中的管理知识

热门文章

  1. WINcc 导出历史数据
  2. 禅道怎么启动mysql_禅道启动mysql报错connectByPDO
  3. ZYNQ开发系列——ZYNQ系统的搭建
  4. js关闭当前窗口、标签页
  5. 务实的思维与学习–如何有意识地思考思维与学习
  6. 高响应比优先算法实现进程调度模拟
  7. Hadoop下载地址大全
  8. 数据结构面试题(含答案)
  9. OSPF 特殊区域介绍、Stub、Totally Stub、NSSA、Totally NSSA
  10. WRF案例运行-Single Domain Case