2011-03-10 51 views
35

¿Cómo recupero todo el contenido HTML que se muestra actualmente en un WebView?Cómo recuperar contenido HTML de WebView (como una cadena)

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

Tenga en cuenta que estoy interesado en la recuperación de los datos de las páginas web que no tengo control sobre (es decir, I no se puede insertar una función de Javascript en esas páginas, por lo que llamaría a una interfaz de Javascript en WebView).

+0

posible duplicado de [¿Cómo consigo la página web contenido de un WebView?] (http://stackoverflow.com/questions/2376471/how-do-i-get-the-web-page-contents-from-a-webview) – Guru

Respuesta

16

Desafortunadamente no hay una manera fácil de hacer esto.

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

Se podía hacer una HttpRequest a la misma página como su vista Web y obtener la respuesta.

+0

Gracias, lo que estás sugiriendo es sin duda mejor de lo que he encontrado hasta ahora, pero .... haciendo HttpRequest a un pa ge ya cargado en WebView DUPLICARÍA los requisitos de ancho de banda (cargando cada página visitada DOS VECES). ¿Hay una mejor solución? – JohnK

+2

Puede hacer una llamada, hacer una HttpRequest para obtener los datos y luego usar WebView.LoadData para insertarlo en WebView – brendan

+0

¿Qué ocurre si la página está detrás de las credenciales de inicio de sesión? –

30

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

Usted recibirá todo el CONTNET HTML en el método processHTML. y no hará otra solicitud de página web. por lo tanto, también es una forma más eficiente de hacer esto.

Gracias.

+3

Se parece a http: // lexandera.com/2009/01/extracting-html-from-a-webview /. Ese tutorial también tiene una advertencia al final. –

+1

@shridutt kothari http://stackoverflow.com/questions/28194699/webview-content-are-not-loaded-properly-if-it-is-xml – GOLDEE

+1

¿Qué pasa si el contenido que se está cargando no está en forma de HTML, es decir, XML? o cualquier otra cosa ahora javascriptinterface no se llama y terminará con TypeError – GOLDEE

0

puede pasar datos a través de JavaScriptInterface from webview .. he hecho esto. guarde los datos en una variable estática luego procese en la aplicación de Android

+0

No es necesario guardarlo en una variable estática, de lo contrario, este enfoque sería, por supuesto, correcto, como ya se ha demostrado anteriormente mediante kothari. –

1

Puede interceptar las solicitudes HTTP realizadas por WebView, y luego modificar el HTML para incluir las funciones de JavaScript que necesite para comunicarse con la página HTML. Usted intercepta las solicitudes HTTP a través del método WebViewClient shouldInterceptRequest().

Al usar este mecanismo, puede obtener acceso a la página cargada cargándola usted mismo, modificarla antes de pasarla a la WebView, e incluso almacenarla en caché localmente si lo desea.

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

      } 
     }); 
+0

funciona como un amuleto –

0

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

continuación, le permite decir lo que para obtener la fuente de Google puede hacer:

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

Se bloquea en Bufferreader. –

+0

No debería fallar descargar el navegador ZunoZap funciona allí –

Cuestiones relacionadas