Android:在加载所有脚本后从页面抓取HTML

时间:2014-09-01 11:18:47

标签: java javascript android

class MyJavaScriptInterface
{
  @SuppressWarnings("unused")
  public void processHTML(String html)
  {
    // process html
  }
}

final WebView browser = (WebView)findViewById(R.id.browser);
browser.getSettings().setJavaScriptEnabled(true);

browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

browser.setWebViewClient(new WebViewClient() {
  @Override
  public void onPageFinished(WebView view, String url)
  {
    new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
      browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
    }
  }, 2000);
}
});

browser.loadUrl("someurl");

我想要实现的是仅在页面上加载所有javascripts时调用processHTML方法(通常在onPageFinished发生后2-3秒)。

我找到的粗鲁的解决方案是使用延迟处理程序,但我会问是否有办法知道何时加载了所有脚本。

我可以循环该处理程序,直到我找不到我想要的信息,但它似乎不是一个优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

这个怎么样:

    webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HtmlViewer");
    webview.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            new Thread(){
                public void run(){
                    try {sleep(2000); } catch(Throwable t){} //change 2 000 ms if you want
                    runOnUiThread(new Runnable(){
                        public void run() {
                            webview.loadUrl("javascript:window.HtmlViewer.showHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
                        }
                    }
            }}.start();
        }
    });

class MyJavaScriptInterface {
    MyJavaScriptInterface(Context ctx) {
    }
    @JavascriptInterface //add this, if your target api is higher than 17
    public void showHTML(String html) {
         //html is your code
    }
}

来源:how to get html content from a webview?

您无法获取信息,所有脚本都已加载。 Somes脚本(例如在线stoper)总是使用JavaScript,它不会结束。 (我的英语不好)