今天简单总结一下,如何通过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;
}
}
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。UIWebViewNavigationTypeOther,发生其它行为。
拼接的Html最后加的按钮的方法如下:
NSURL * path = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"source_page_button" ofType:@"png"]];
[strReturn appendString:[NSString stringWithFormat:@"",_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;
}