天天看點

webview 擷取網頁上的資料

最近做webview,遇到2種需求,一種是在自己伺服器上的HTML中擷取資料,另一種是通過自己伺服器上的HTML中的超連結跳到另一個站點的HTML中,并擷取資料。

于是,總結了2種通過webview擷取網頁上的資料的方式:

第一種:簡單點的,直接通過js調java,在調用方法的過程中将資料通過方法的參數傳遞給Android端,(前提:服務端有對應的faxun對象,而且調用的方法是showImages(String[] imgUrls))。

<span style="font-size:18px;">class MyJavaScriptInterface { MyJavaScriptInterface() { } /** * js調java,顯示圖檔 * * @param imgUrls */ @JavascriptInterface public void showImages(String[] imgUrls) { LogUtils.i(TAG, "imgUrls = " + imgUrls[0]); NewsDetailWebviewActivity.this.imgUrls = imgUrls; } } ... webView.addJavascriptInterface(new MyJavaScriptInterface(), "faxun");</span>

第二種:有點複雜,通過webview注冊一個本地接口後,然後通過java調js,拿到document對象後,解析HTML标簽,然後資料會通過本地接口中的回調方法傳遞給Android端,(前提:HTML頁面中的meta标簽中有對應的reply_info名稱和content屬性,資料是封裝在content裡面的json格式的字元串)。

<span style="font-size:18px;">class MyWebClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { view.loadUrl("javascript:window.getShareData.OnGetShareData(" + "document.querySelector('meta[name=\"reply_info\"]').getAttribute('content')" + ");"); super.onPageFinished(view, url); } } private class GetShareDataInterface { @JavascriptInterface public void OnGetShareData(String shareData) { if (null != shareData) { try { JSONObject shareJson = new JSONObject(shareData); title = shareJson.optString("title"); description = shareJson.optString("description"); p_w_picpathUrl = shareJson.optString("p_w_picpathUrl"); } catch (JSONException e) { e.printStackTrace(); } } } } ..... webView.setWebViewClient(new MyWebClient()); </span>

其實,如果是普通的需求,兩種方式都可以解決問題,但是如果是有些HTML沒有做js調java,隻是個普通的HTML,并且需要擷取頁面上的資料時,隻能通過第二種方式來擷取HTML上的資料了,比如擷取HTML上的title等等。