2011-03-10 101 views
35

如何檢索當前在WebView中顯示的所有HTML內容?如何從WebView中檢索HTML內容(作爲字符串)

我發現WebView.loadData()但我無法找到相反的當量(如WebView.getData())

請注意,我感興趣的檢索的網頁,我無法控制的數據(即我不能將Javascript函數注入到這些頁面中,以便在WebView中調用Javascript接口)。

+0

可能重複[我怎樣網頁內容從WebView?](http://stackoverflow.com/questions/2376471/how-do-i-get-the-web-page-contents-from-a-webview) – Guru 2013-03-20 14:50:45

回答

16

不幸的是,有沒有簡單的方法來做到這一點。

How do I get the web page contents from a WebView?

你可以只讓一個HTTPRequest,在同一頁面的網頁視圖,並得到響應。

+0

謝謝,你的建議是肯定比我目前發現的要好,但是......使HttpRequest成爲一個pa已經加載到WebView的ge會雙倍帶寬要求(加載每個瀏覽過的頁面TWICE)。有更好的解決方案嗎? – JohnK 2011-03-10 18:59:43

+2

您可以進行一次調用,使HttpRequest獲取數據,然後使用WebView.LoadData將其推送到WebView中 – brendan 2011-03-10 19:16:18

+0

如果特定頁面位於登錄憑證的後面,該怎麼辦? – 2012-10-10 22:10:47

30

你可以做到這一點通過:

final Context myApp = this; 

/* An instance of this class will be registered as a JavaScript interface */ 
class MyJavaScriptInterface 
{ 
    @SuppressWarnings("unused") 
    public void processHTML(String html) 
    { 
     // process the html as needed by the app 
    } 
} 

final WebView browser = (WebView)findViewById(R.id.browser); 
/* JavaScript must be enabled if you want it to work, obviously */ 
browser.getSettings().setJavaScriptEnabled(true); 

/* Register a new JavaScript interface called HTMLOUT */ 
browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); 

/* WebViewClient must be set BEFORE calling loadUrl! */ 
browser.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageFinished(WebView view, String url) 
    { 
     /* This call inject JavaScript into the page which just finished loading. */ 
     browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');"); 
    } 
}); 

/* load a web page */ 
browser.loadUrl("http://lexandera.com/files/jsexamples/gethtml.html"); 

您將獲得processHTML方法的整個HTML contnet。 ,它不會再提出網頁請求。所以它也是這樣做的更有效的方法。

謝謝。

+3

看起來類似於http:// lexandera。COM/2009/01 /提取-HTML-從-A-web視圖/。該教程最後還有一個警告。 – 2014-01-10 22:19:57

+1

@shridutt kothari http://stackoverflow.com/questions/28194699/webview-content-are-not-loaded-properly-if-it-is-xml – GOLDEE 2015-01-29 11:16:52

+1

如果被加載的內容不是HTML格式,即XML或其他任何東西現在javascriptinterface沒有得到調用,並最終與TypeError – GOLDEE 2015-01-29 11:20:00

0

你可以通過webview中的JavaScriptInterface傳遞數據..我已經做到了。 將數據保存爲靜態變量,然後在Android應用程序中進行處理

+0

你不需要把它保存到一個靜態變量,否則這種方法當然是正確的 - 就像它已經被上面的kothari所示。 – 2014-04-10 17:08:10

1

您可以攔截WebView所做的HTTP請求,然後修改HTML以包含您需要與HTML頁面通信的任何JavaScript函數。您可以通過WebViewClient shouldInterceptRequest()方法攔截HTTP請求。

使用此機制,您可以通過自己加載來訪問加載的頁面,在將其傳遞到WebView之前對其進行修改,甚至可以將其緩存在本地(如果需要)。

8
webView.evaluateJavascript("(function(){return window.document.body.outerHTML})();", 
     new ValueCallback<String>() { 
      @Override 
      public void onReceiveValue(String html) { 

      } 
     }); 
+0

作品像一個魅力 – 2017-07-05 10:19:20

0

添加到您的代碼:

private String getUrlSource(String site) throws IOException { 
    //GNU Public, from ZunoZap Web Browser 
    URL url = new URL(site); 
    URLConnection urlc = url.openConnection(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(
    urlc.getInputStream(), "UTF-8")); 
    String inputLine; 
    StringBuilder a = new StringBuilder(); 
    while ((inputLine = in.readLine()) != null) 
    a.append(inputLine); 
    in.close(); 

    return a.toString(); 
} 

那麼可以說你得到什麼谷歌的來源,你會怎麼做:

getURLSource("http://google.com"); 
+1

崩潰在緩衝器。 – 2016-07-24 20:27:29

+0

不應該崩潰下載它在那裏工作的ZunoZap瀏覽器 – 2016-07-27 04:37:46