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);
        }
    }

}
在WPF(Windows Presentation Foundation)中,使用WebView2组件可以嵌入现代Web内容并充分利用HTML5、JavaScript的强大功能。如果你想仅抓取网页的部分功能,比如特定的数据或API调用,而不显示整个页面,你可以通过以下步骤实现: 1. **设置WebView2源**: 首先,在XAML中创建WebView2元素,并配置其Source属性指向需要抓取的网页地址。 ```xml <Microsoft.Web.WebView2.Wpf.WebView2 x:Name="webView" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> ``` 2. **JavaScript Interop**: 使用WebView2的JavaScriptInterop特性,允许你在C#中与JavaScript交互。在C#代码背后,你可以编写JavaScript函数,然后通过`WebView2.InvokeScriptAsync`方法调用。 ```csharp await webView.CoreWebView2.InvokeScriptAsync("window.myFunction = function(param) { /* your JavaScript code here */};"); ``` 3. **数据抓取**: 在JavaScript中编写函数,比如获取某个元素的文本或者通过AJAX请求获取数据,然后将结果返回给C#代码。例如,假设你想抓取某个CSS选择器下的文本: ```javascript function getDataFromSelector(selector) { var element = document.querySelector(selector); return element.innerText; } ``` 4. **C#处理返回值**: 调用`InvokeScriptAsync`后,你需要注册一个回调来接收返回的结果: ```csharp webView.CoreWebView2.ExecuteScriptAsync( "getDataFromSelector('#your-selector')", result => { string data = result?.GetString(); // 处理抓取到的数据 } ); ``` 5. **避免渲染整个页面**: 如果不需要渲染整个页面,可以使用`WebView2.NavigateToString`或`WebView2.NavigateUri`直接传递需要的内容,而不是加载完整的网页URL。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值