【问题标题】:How to retrieve HTML content from WebView (as a string)如何从 WebView 中检索 HTML 内容(作为字符串)
【发布时间】:2011-07-12 23:00:34
【问题描述】:

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

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

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

【问题讨论】:

标签: android webview android-webview


【解决方案1】:

不幸的是,没有简单的方法来做到这一点。

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

您可以向与您的 WebView 相同的页面发出 HttpRequest 并获得响应。

【讨论】:

  • 谢谢,你的建议肯定比我目前发现的要好,但是.... 向已经加载到 WebView 的页面发出 HttpRequest 会使带宽需求加倍(加载每个浏览的页面两次)。有更好的解决方案吗?
  • 你可以打一个电话,发出一个HttpRequest来获取数据,然后使用WebView.LoadData将它推送到WebView中
  • 如果特定页面在登录凭据后面怎么办?
  • 使用 HttpRequest 获取数据可能不是您期望获取的所有数据。页面的某些部分可能只有在页面在客户端呈现后才会加载。这是从已经呈现并获取页面部分的 webview 获取页面的优势。话虽如此,您仍然可以获取可见部分的所有数据,只有那些已渲染,并且仍然可能存在未加载的数据,因为您还没有看到它。
  • 您只需要使用带有所需 url 的 .GET 来使用 Rest Request
【解决方案2】:

您可以通过以下方式实现:

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 网络。 它不会再次请求网页。所以这也是更有效的方法。

谢谢。

【讨论】:

  • 看起来类似于lexandera.com/2009/01/extracting-html-from-a-webview。该教程最后也有警告。
  • 如果正在加载的内容不是 HTML 的形式,即 XML 或其他任何东西,现在 javascriptinterface 没有被调用,最终会出现 TypeError
  • 尝试理解答案中的代码,您也会找到获取其他类型内容的方法。谢谢。
  • @shridutt kothari 下次请注明您的来源。很明显,您从 Bernd S 指出的链接中复制并粘贴了您的答案(这本身并不是一件坏事)。在应得的地方给予赞扬,并让 OP 自己判断解决方案是件好事.
【解决方案3】:

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

【讨论】:

  • 您不需要将其保存到静态变量中,否则这种方法当然是正确的——就像上面的 kothari 已经展示的那样。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:
    webView.evaluateJavascript("(function(){return window.document.body.outerHTML})();", 
          new ValueCallback<String>() {
              @Override
              public void onReceiveValue(String html) {
    
              }
          });
    

    【讨论】:

      【解决方案6】:

      将此添加到您的代码中:

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

      然后让我们告诉你如何获取 Google 的源代码:

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

      【讨论】:

      • 下载它在其中工作的 ZunoZap 浏览器应该不会崩溃
      猜你喜欢
      • 1970-01-01
      • 2017-05-01
      • 2018-09-04
      • 2015-11-19
      • 1970-01-01
      • 2012-10-13
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多