Android 如何从WebView检索HTML内容(作为字符串)

Android 如何从WebView检索HTML内容(作为字符串),android,webview,android-webview,Android,Webview,Android Webview,如何检索WebView中当前显示的所有HTML内容 我找到了WebView.loadData(),但找不到相反的等价物(例如WebView.getData()) 请注意,我对检索我无法控制的网页的数据感兴趣(即,我无法将Javascript函数注入这些网页,以便它在WebView中调用Javascript接口)。不幸的是,这不是一个简单的方法 看 您只需对与WebView相同的页面进行HttpRequest并获得响应。您可以通过以下方式实现此目的: final Context myApp = t

如何检索WebView中当前显示的所有HTML内容

我找到了
WebView.loadData()
,但找不到相反的等价物(例如WebView.getData())


请注意,我对检索我无法控制的网页的数据感兴趣(即,我无法将Javascript函数注入这些网页,以便它在WebView中调用Javascript接口)。

不幸的是,这不是一个简单的方法


您只需对与WebView相同的页面进行HttpRequest并获得响应。

您可以通过以下方式实现此目的:

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");
final Context myApp=this;
/*此类的实例将注册为JavaScript接口*/
类MyJavaScriptInterface
{
@抑制警告(“未使用”)
公共空处理html(字符串html)
{
//根据应用程序的需要处理html
}
}
最终WebView浏览器=(WebView)findViewById(R.id.browser);
/*显然,如果您想让JavaScript正常工作,就必须启用它*/
browser.getSettings().setJavaScriptEnabled(true);
/*注册一个名为HTMLOUT的新JavaScript接口*/
addJavascriptInterface(新的MyJavaScriptInterface(),“HTMLOUT”);
/*在调用loadUrl之前必须设置WebViewClient*/
setWebViewClient(新的WebViewClient(){
@凌驾
公共void onPageFinished(WebView视图,字符串url)
{
/*这个调用将JavaScript注入到刚刚完成加载的页面中*/
browser.loadUrl(“javascript:window.HTMLOUT.processHTML(“”+document.getElementsByTagName('html')[0]。innerHTML+“”);”;
}
});
/*加载网页*/
browser.loadUrl(“http://lexandera.com/files/jsexamples/gethtml.html");
您将在processHTML方法中获得整个Html contnet。 而且它不会对网页提出另一个请求。所以这也是一种更有效的方法


谢谢。

您可以通过JavaScriptInterface从webview传递数据。。我已经做到了。
将数据保存到一个静态变量,然后在android application下处理

您可以拦截WebView发出的HTTP请求,然后修改HTML以包含与HTML页面通信所需的任何JavaScript函数。您可以通过WebViewClient shouldInterceptRequest()方法拦截HTTP请求

使用此机制,您可以通过自己加载来访问加载的页面,在将其传递到WebView之前对其进行修改,甚至可以根据需要在本地缓存它。

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

          }
      });
新的ValueCallback(){ @凌驾 公共void onReceiveValue(字符串html){ } });
将此添加到您的代码中:

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

谢谢,你的建议肯定比我目前发现的要好,但是。。。。对已经加载到WebView的页面进行HttpRequest将使带宽需求增加一倍(每个浏览的页面加载两次)。有更好的解决方案吗?您可以打一个电话,进行HttpRequest以获取数据,然后使用WebView.LoadData将其推送到WebView中。如果特定页面位于登录凭据之后,该怎么办?使用HttpRequest获取数据可能不是您希望获得的全部数据。可能只有在客户端呈现页面后才会加载页面的某些部分。这是从webview获取已经呈现并获取部分页面的页面的优势。使用上述方法,您可以仅获取已渲染的可见部分的所有数据,并且可能仍有未加载的数据,因为您尚未看到它。您只需使用Rest请求,使用所需的URL执行.get即可。可能的外观重复类似于。该教程最后还有一个警告。@shridutt kothari如果加载的内容不是HTML格式的,即XML或其他格式的,那么现在javascriptinterface没有被调用,并且最终将以TypeError结束。尝试理解回答中的代码,您也会找到获取其他类型内容的方法。谢谢。@shridutt kothari下次请相信你的消息来源。很明显,你从Bernd S指出的链接中复制并粘贴了你的答案(这本身并不是一件坏事)。在值得表扬的地方给予表扬,让OP自己判断解决方案,这很好。你不需要将其保存到静态变量中,否则,这种方法当然是正确的——就像上面kothari已经展示过的那样。不应该因为下载ZunoZap浏览器而崩溃