¿Cómo obtengo el contenido de la página web desde un WebView?

Resuelto gregm asked hace 54 años • 7 respuestas

En Android, tengo un WebViewque muestra una página.

¿Cómo obtengo la fuente de la página sin volver a solicitarla?

Parece que WebViewdebería tener algún tipo de getPageSource()método que devuelva una cadena, pero lamentablemente no es así.

Si habilito JavaScript, ¿cuál es el JavaScript apropiado para incluir en esta llamada para obtener el contenido?

webview.loadUrl("javascript:(function() { " +  
    "document.getElementsByTagName('body')[0].style.color = 'red'; " +  
    "})()");  
gregm avatar Jan 01 '70 08:01 gregm
Aceptado

Creo que encontré la respuesta en esta publicación en lexandera.com. El siguiente código es básicamente un cortar y pegar del sitio. Parece funcionar.

final Context myApp = this;

/* An instance of this class will be registered as a JavaScript interface */
class MyJavaScriptInterface
{
    @JavascriptInterface
    @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('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
    }
});

/* load a web page */
browser.loadUrl("http://lexandera.com/files/jsexamples/gethtml.html");
jluckyiv avatar Feb 03 '2011 21:02 jluckyiv

Según el número 12987 , la respuesta de Blundell falla (al menos en mi VM 2.3). En lugar de eso, intercepto una llamada a console.log con un prefijo especial:

// intercept calls to console.log
web.setWebChromeClient(new WebChromeClient() {
    public boolean onConsoleMessage(ConsoleMessage cmsg)
    {
        // check secret prefix
        if (cmsg.message().startsWith("MAGIC"))
        {
            String msg = cmsg.message().substring(5); // strip off prefix

            /* process HTML */

            return true;
        }

        return false;
    }
});

// inject the JavaScript on page load
web.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String address)
    {
        // have the page spill its guts, with a secret prefix
        view.loadUrl("javascript:console.log('MAGIC'+document.getElementsByTagName('html')[0].innerHTML);");
    }
});

web.loadUrl("http://www.google.com");
durka42 avatar Dec 24 '2011 06:12 durka42

Esta es una respuesta basada en jluckyiv , pero creo que es mejor y más sencillo cambiar Javascript de la siguiente manera.

browser.loadUrl("javascript:HTMLOUT.processHTML(document.documentElement.outerHTML);");
nagoya0 avatar Apr 17 '2012 02:04 nagoya0