¿Cómo puedo recuperar todo el contenido HTML que se muestra actualmente en un WebView?

He encontrado WebView.loadData(), pero no pude encontrar el opuesto equivalente (por ejemplo, WebView.getData())

Por favor, tenga en cuenta que estoy interesado en la recuperación de los datos para las páginas web que no tengo control sobre (es decir, no puedo inyectar una función de Javascript en esas páginas, por lo que se podría llamar una interfaz Javascript en WebView).

InformationsquelleAutor JohnK | 2011-03-10

6 Comentarios

  1. 17

    Desafortunadamente no hay manera fácil de hacer esto.

    Ver ¿Cómo puedo obtener el contenido de la página web de un WebView?

    Usted sólo puede hacer un HttpRequest a la misma página que tu WebView y obtener la respuesta.

    • Gracias, lo que estás sugiriendo es sin duda mejor de lo que me he encontrado hasta ahora, pero…. hacer HttpRequest a una página que ya esta disponible para WebView sería el DOBLE de los requisitos de ancho de banda (carga de cada navegado por la página dos veces). Hay una solución mejor?
    • Usted puede hacer una llamada, hacer una HttpRequest para obtener los datos, a continuación, utilizar WebView.LoadData a empujar en el WebView
    • ¿Qué pasa si la página está detrás de credenciales de inicio de sesión?
    • Ver a mi debajo de respuesta.
    • Hace este trabajo con los datos POST demasiado??
    • La obtención de los datos mediante HttpRequest no puede ser el de todos los datos que espera recibir. Puede haber partes de la página que se cargará sólo después de que la página se representa en el lado del cliente. Esta es la ventaja de conseguir desde la página de webview que ya prestados y consiguió partes de la página. Con eso dicho todavía puede obtener todos los datos de la parte visible sólo que fue secuestrado y todavía puede haber datos que no estaba cargada, ya que no se ve todavía.
    • Sólo tienes que utilizar Resto de Solicitud haciendo .OBTENER la url

  2. 33

    Usted puede lograr esto a través de:

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

    Obtendrá todo el Html contnet en processHTML método.
    y no lo puedo hacer de otra solicitud para la página web. así es también la forma más eficiente de hacer esto.

    Gracias.

    • Es similar a lexandera.com/2009/01/extracting-html-from-a-webview. El tutorial también tiene una advertencia al final.
    • kothari stackoverflow.com/questions/28194699/…
    • ¿Qué pasa si el contenido que se carga no es en forma de HTML, es decir, XML o cualquier otra cosa ahora javascriptinterface no está recibiendo la llamada y va a terminar con TypeError
    • tratar de entender el código de respuesta, tendría que encontrar la manera de obtener otro tipo de contenido también. gracias.
    • ¿funciona con el post de respuesta demasiado??
    • kothari la Próxima vez por favor cite la fuente. Es obvio que copió y pegó su respuesta (que no es una mala cosa en sí misma) desde el enlace señalado por Bernd S. Es sólo bueno para dar crédito donde el crédito es debido, y para permitir que el OP para juzgar la solución por sí mismo.

  3. 11
    webView.evaluateJavascript("(function(){return window.document.body.outerHTML})();", 
          new ValueCallback<String>() {
              @Override
              public void onReceiveValue(String html) {
    
              }
          });
    • funciona como un encanto
  4. 2

    Agregar esto a su código:

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

    a continuación, vamos a decir que lo que se obtiene de Google fuente que haría:

    getURLSource("http://google.com");
    • De estrellarse en el Bufferreader.
    • No debe ser estrellarse descargar el ZunoZap Navegador funciona allí
  5. 1

    Puede interceptar las peticiones HTTP realizadas por el WebView y, a continuación, modificar el código HTML para incluir cualquiera de las funciones de JavaScript que usted necesita para comunicarse con la página HTML. Usted interceptar las peticiones HTTP a través de la WebViewClient shouldInterceptRequest() método.

    Mediante este mecanismo se puede obtener acceso a la página cargada por la carga de ti mismo, de modificarlo antes de pasar a la WebView, e incluso la memoria caché de forma local si lo desea.

  6. 0

    puede pasar datos a través de JavaScriptInterface de webview.. yo lo he hecho.
    guardar los datos en una variable estática, a continuación, proceso bajo android aplicación

    • No es necesario guardarlo en una variable estática, de lo contrario, este enfoque sería correcto que – como ya ha sido demostrado por kothari arriba.

Dejar respuesta

Please enter your comment!
Please enter your name here