WebView之 提取网页内容

日前遇到了这么一个需求,用WebView去加载url,在WebView 页面加载成功后,提取页面的内容。在页面加载完成再提取,就需要设置WebViewClient对象,重写 里面的的方法:

  client = new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                Log.e("webview", "shouldOverrideUrlLoading: "+request.toString() );
                return super.shouldOverrideUrlLoading(view, request);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.e("webview", "onPageFinished: "+url );
                view.loadUrl("javascript:window.local_obj.showSource('<head>'+" +
                        "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
                super.onPageFinished(view, url);
            }
        };
        webView.setWebViewClient(client);

上面代码在 onPageFinished (页面加载完成)里面执行了一个loadUrl 方法,去获取页面内容,loadUrl 里面的内容,既然用到了JS则需要设置 webview 支持JS语法的使用: webView.getSettings().setJavaScriptEnabled(true); 

同时 我们用js获取内容后 如何在JAVA 成展现呢,WebView 需要设置 接口:

webView.addJavascriptInterface(new JS(context),"local_obj");

在 设置WebView 支持JS 添加 映射接口时,还需要添加注释,否者可能获取不到HTML数据

@SuppressLint({"JavascriptInterface","SetJavaScriptEnabled","AddJavascriptInterface"})

通过这个方法就可以将JS成调用的方法 映射到JAVA成的方法里面,而后面的 local_obj,就是loadUrl 用的的全局的一个对象来获取HTML 内容,来看看JAVA 层 JS 这个类的是如何实现的: 

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public final class JS {

    Context context;

    Pattern pattern;
    Matcher matcher;
    ClipboardManager cm;
    ClipData clipData;

    public JS(Context context) {
        this.context = context;
        cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    }
    @JavascriptInterface
    @SuppressWarnings("unused")
    public void showSource(String html){
        Log.e("html",html);
        getMesg(html);
    }
}

JS类很简单就一个final 类 里面一个方法 接受 获取的HTML、内容,但是要注意到有一个注解 @JavascriptInterface,这个注解说明这个是和Js 的通信接口,在Js中可以调用这个获取HTML内容,我们在这个方法里做一些提取操作。

再来看下 onPageFinish 里面使用的loadUrl 里面的内容:

"javascript:window.local_obj.showSource('<head>'+" +
        "document.getElementsByTagName('html')[0].innerHTML+'</head>');"

javascript:说明调用 js方法,而这个方法我们看的很眼熟:local_obj.showSource ,其实这个就是我们JAVA成定义的JS类里面的内容,而window.  这个是JS里面一个全局的操作,这里不做多讲解,而 这个方法里面的也是Js提取标签内容的一个Js语法操作,至此 WebView 提取HTML的内容就结束了。这里贴出完整的代码

 

 @SuppressLint({"JavascriptInterface","SetJavaScriptEnabled","AddJavascriptInterface"})
    void initWebView(){
        webView = new WebView(context);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.addJavascriptInterface(new JS(context),"local_obj");
        client = new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                Log.e("webview", "shouldOverrideUrlLoading: "+request.toString() );
                return super.shouldOverrideUrlLoading(view, request);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.e("webview", "onPageFinished: "+url );
                view.loadUrl("javascript:window.local_obj.showSource('<head>'+" +
                        "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
                super.onPageFinished(view, url);
            }
        };
        webView.setWebViewClient(client);
    }



public final class JS {

    Context context;

    Pattern pattern;
    Matcher matcher;
    ClipboardManager cm;
    ClipData clipData;

    public JS(Context context) {
        this.context = context;
        cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    }
    @JavascriptInterface
    @SuppressWarnings("unused")
    public void showSource(String html){
        Log.e("html",html);
        getMesg(html);
    }
    public void getMesg(String html){

        String patterns = "<pre style=\"word-wrap: break-word; white-space: pre-wrap;\">(.*?)</pre>";
        pattern = Pattern.compile(patterns);
        matcher = pattern.matcher(html);
        if (matcher.find()){
          clipData = ClipData.newPlainText("Label",matcher.group(1));
          cm.setPrimaryClip(clipData);
        }
    }

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值