cómo obtener contenido html desde una vista web?

¿Cuál es el método más simple para obtener código html desde una vista web? He intentado varios métodos de stackoverflow y google, pero no puedo encontrar un método exacto. Por favor mencione una manera exacta.

public class htmldecoder extends Activity implements OnClickListener,TextWatcher { TextView txturl; Button btgo; WebView wvbrowser; TextView txtcode; ImageButton btcode; LinearLayout llayout; int flagbtcode; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.htmldecoder); txturl=(TextView)findViewById(R.id.txturl); btgo=(Button)findViewById(R.id.btgo); btgo.setOnClickListener(this); wvbrowser=(WebView)findViewById(R.id.wvbrowser); wvbrowser.setWebViewClient(new HelloWebViewClient()); wvbrowser.getSettings().setJavaScriptEnabled(true); wvbrowser.getSettings().setPluginsEnabled(true); wvbrowser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); wvbrowser.addJavascriptInterface(new MyJavaScriptInterface(),"HTMLOUT"); //wvbrowser.loadUrl("http://www.google.com"); wvbrowser.loadUrl("javascript:window.HTMLOUT.showHTML(''+document.getElementsByTagName('html')[0].innerHTML+'');"); txtcode=(TextView)findViewById(R.id.txtcode); txtcode.addTextChangedListener(this); btcode=(ImageButton)findViewById(R.id.btcode); btcode.setOnClickListener(this); } public void onClick(View v) { if(btgo==v) { String url=txturl.getText().toString(); if(!txturl.getText().toString().contains("http://")) { url="http://"+url; } wvbrowser.loadUrl(url); //wvbrowser.loadData("
","text/html","utf-8"); } else if(btcode==v) { ViewGroup.LayoutParams params1=wvbrowser.getLayoutParams(); ViewGroup.LayoutParams params2=txtcode.getLayoutParams(); if(flagbtcode==1) { params1.height=200; params2.height=220; flagbtcode=0; //txtcode.setText(wvbrowser.getContentDescription()); } else { params1.height=420; params2.height=0; flagbtcode=1; } wvbrowser.setLayoutParams(params1); txtcode.setLayoutParams(params2); } } public class HelloWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } /*@Override public void onPageFinished(WebView view, String url) { // This call inject JavaScript into the page which just finished loading. wvbrowser.loadUrl("javascript:window.HTMLOUT.processHTML(''+document.getElementsByTagName('html')[0].innerHTML+'');"); }*/ } class MyJavaScriptInterface { @SuppressWarnings("unused") public void showHTML(String html) { txtcode.setText(html); } } public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } public void onTextChanged(CharSequence s, int start, int before, int count) { wvbrowser.loadData("
","text/html","utf-8"); } }

En realidad, esta pregunta tiene muchas respuestas. Aquí hay 2 de ellos:

  • Este primero es casi el mismo que el tuyo, supongo que lo obtuvimos del mismo tutorial.

 public class TestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.webview); final WebView webview = (WebView) findViewById(R.id.browser); webview.getSettings().setJavaScriptEnabled(true); webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HtmlViewer"); webview.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webview.loadUrl("javascript:window.HtmlViewer.showHTML" + "(''+document.getElementsByTagName('html')[0].innerHTML+'');"); } }); webview.loadUrl("http://android-in-action.com/index.php?post/" + "Common-errors-and-bugs-and-how-to-solve-avoid-them"); } class MyJavaScriptInterface { private Context ctx; MyJavaScriptInterface(Context ctx) { this.ctx = ctx; } public void showHTML(String html) { new AlertDialog.Builder(ctx).setTitle("HTML").setMessage(html) .setPositiveButton(android.R.string.ok, null).setCancelable(false).create().show(); } } } 

De esta manera, puede obtener el html a través de javascript. No es la manera más bonita, pero cuando tienes tu interfaz de JavaScript, puedes agregar otros métodos para modificarla.


  • Otra forma es usar un HttpClient como allí .

La opción que elija también depende, creo, de lo que piense hacer con el html recuperado …

Para Android 4.2, no te olvides de agregar @JavascriptInterface a todas las funciones de javasscript

En KitKat y superior, puedes usar el método de evaluateJavascript de JavaScript en la vista web

 wvbrowser.evaluateJavascript( "(function() { return (''+document.getElementsByTagName('html')[0].innerHTML+''); })();", new ValueCallback() { @Override public void onReceiveValue(String html) { Log.d("HTML", html); // code here } }); 

Vea esta respuesta para más ejemplos

Android WebView es simplemente otro motor de renderizado que hace que los contenidos HTML se descarguen de un servidor HTTP, al igual que Chrome o Firefox. No sé por qué necesita obtener la página renderizada (o captura de pantalla) de WebView. Para la mayoría de las situaciones, esto no es necesario. Siempre puede obtener el contenido HTML sin formato del servidor HTTP directamente.

Ya hay respuestas publicadas sobre cómo obtener la transmisión sin procesar usando HttpUrlConnection o HttpClient. Alternativamente, hay una biblioteca muy útil cuando se trata de análisis / análisis de contenido HTML en Android: JSoup , proporciona API muy simple para obtener contenidos HTML del servidor HTTP y proporciona una representación abstracta del documento HTML para ayudarnos a gestionar el análisis HTML no solo en un estilo más OO pero también muy fácilmente:

 // Single line of statement to get HTML document from HTTP server. Document doc = Jsoup.connect("http://en.wikipedia.org/").get(); 

Es útil cuando, por ejemplo, desea descargar primero un documento HTML y luego agregarle css o javascript personalizados antes de pasarlo a WebView para su renderizado. Mucho más en su sitio web oficial, vale la pena comprobarlo.

Un punto de contacto que encontré que debe ponerse en su lugar está “oculto” en la configuración de Proguard. Mientras que el lector de HTML invoca a través de la interfaz de JavaScript muy bien al depurar la aplicación, esto ya no funciona tan pronto como la aplicación se ejecutó a través de Proguard, a menos que la función de lector HTML se declare en el archivo de configuración de Proguard, así:

 -keepclassmembers class  { public *; } 

Probado y confirmado en Android 2.3.6, 4.1.1 y 4.2.1.

Android no te permitirá hacer esto por cuestiones de seguridad. Un desarrollador malvado podría robar fácilmente la información de inicio de sesión ingresada por el usuario.

En su lugar, debe capturar el texto que se muestra en la vista web antes de que se muestre. Si no desea configurar un controlador de respuesta (según las otras respuestas), encontré esta solución con algunos googlear:

 URL url = new URL("https://stackoverflow.com/questions/1381617"); URLConnection con = url.openConnection(); Pattern p = Pattern.compile("text/html;\\s+charset=([^\\s]+)\\s*"); Matcher m = p.matcher(con.getContentType()); /* If Content-Type doesn't match this pre-conception, choose default and * hope for the best. */ String charset = m.matches() ? m.group(1) : "ISO-8859-1"; Reader r = new InputStreamReader(con.getInputStream(), charset); StringBuilder buf = new StringBuilder(); while (true) { int ch = r.read(); if (ch < 0) break; buf.append((char) ch); } String str = buf.toString(); 

Esto es mucho código, y debería poder copiarlo / pegarlo, y al final de él str contendrá el mismo html dibujado en la vista web. Esta respuesta es de la manera más sencilla de cargar html correctamente desde la página web en una cadena en Java y debería funcionar también en Android. No he probado esto y no lo escribí yo mismo, pero podría ayudarte.

Además, la URL que está tirando está codificada, por lo que tendrá que cambiar eso.

¿Por qué no obtener el html primero y luego pasarlo a la vista web?

 private String getHtml(String url){ HttpGet pageGet = new HttpGet(url); ResponseHandler handler = new ResponseHandler() { public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { HttpEntity entity = response.getEntity(); String html; if (entity != null) { html = EntityUtils.toString(entity); return html; } else { return null; } } }; pageHTML = null; try { while (pageHTML==null){ pageHTML = client.execute(pageGet, handler); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return pageHTML; } @Override public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom) { mRom.setFileSize(getFileSize(mRom.getURLSuffix())); webview.getSettings().setJavaScriptEnabled(true); WebViewClient anchorWebViewClient = new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); //Do what you want to with the html String html = getHTML(url); if( html!=null && !url.equals(lastLoadedURL)){ lastLoadedURL = url; webview.loadDataWithBaseURL(url, html, null, "utf-8", url); } } 

Esto debería hacer más o menos lo que quieras hacer. Está adaptado de ¿Es posible obtener el código HTML de WebView y gritar a https://stackoverflow.com/users/325081/aymon-fournier por su respuesta.

Sugeriría que en lugar de tratar de extraer el HTML de WebView, extraiga el HTML de la URL. Con esto, me refiero al uso de una biblioteca de terceros como JSoup para recorrer el HTML por usted. El siguiente código obtendrá el HTML de una URL específica para usted

 public static String getHtml(String url) throws ClientProtocolException, IOException { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpGet httpGet = new HttpGet(url); HttpResponse response = httpClient.execute(httpGet, localContext); String result = ""; BufferedReader reader = new BufferedReader( new InputStreamReader( response.getEntity().getContent() ) ); String line = null; while ((line = reader.readLine()) != null){ result += line + "\n"; } return result; } 

intente usar HttpClient como Sephy dijo:

 public String getHtml(String url) { HttpClient vClient = new DefaultHttpClient(); HttpGet vGet = new HttpGet(url); String response = ""; try { ResponseHandler vHandler = new BasicResponseHandler(); response = vClient.execute(vGet, vHandler); } catch (Exception e) { e.printStackTrace(); } return response; } 

Es simple de implementar. Solo necesita métodos javasript en su html para obtener el valor del contenido html. Como arriba de su código, algunos cambios son necesarios.

  public class htmldecoder extends Activity implements OnClickListener,TextWatcher { Button btsubmit; // this button in your xml file WebView wvbrowser; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.htmldecoder); btsubmit=(Button)findViewById(R.id.btsubmit); btsubmit.setOnClickListener(this); wvbrowser=(WebView)findViewById(R.id.wvbrowser); wvbrowser.setWebViewClient(new HelloWebViewClient()); wvbrowser.getSettings().setJavaScriptEnabled(true); wvbrowser.getSettings().setPluginsEnabled(true); wvbrowser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); MyJavaScriptInterface myinterface=new MyJavaScriptInterface(); wvbrowser.addJavascriptInterface(myinterface,"interface"); webView.loadUrl("file:///android_asset/simple.html"); //use one html file for //testing put your html file in assets. Make sure that you done JavaScript methods to get //values for html content in html file . } public void onClick(View v) { if(btsubmit==v) { webView.loadUrl("javascript:showalert()");// call javascript method. //wvbr } } final class MyJavaScriptInterface { MyJavaScriptInterface() { } public void sendValueFromHtml(String value) { System.out.println("Here is the value from html::"+value); } } } 

Tu Javascript en html

   

& Asegúrese de llamar a callme como a continuación en html


Espero que esto te ayudará.

Sugiero probar algún enfoque de Reflexión, si tiene tiempo para gastar en el depurador (lo siento pero no tuve).

A partir del método loadUrl() de la clase android.webkit.WebView :

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/webkit/WebView.java#WebView.loadUrl%28java.lang.String % 2Cjava.util.Map% 29

Debería llegar al android.webkit.BrowserFrame que llama al método nativo nativeLoadUrl() :

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/webkit/BrowserFrame.java#BrowserFrame.nativeLoadUrl%28java.lang.String % 2Cjava.util.Map% 29

La implementación del método nativo debería estar aquí:

http://gitorious.org/0xdroid/external_webkit/blobs/a538f34148bb04aa6ccfbb89dfd5fd784a4208b1/WebKit/android/jni/WebCoreFrameBridge.cpp

¡Te deseo buena suerte!

los métodos dados anteriormente son para si tienes una url web, pero si tienes un html local, entonces también puedes tener html con este código

 AssetManager mgr = mContext.getAssets(); try { InputStream in = null; if(condition)//you have a local html saved in assets { in = mgr.open(mFileName,AssetManager.ACCESS_BUFFER); } else if(condition)//you have an url { URL feedURL = new URL(sURL); in = feedURL.openConnection().getInputStream();} // here you will get your html String sHTML = streamToString(in); in.close(); //display this html in the browser or web view } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } public static String streamToString(InputStream in) throws IOException { if(in == null) { return ""; } Writer writer = new StringWriter(); char[] buffer = new char[1024]; try { Reader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); int n; while ((n = reader.read(buffer)) != -1) { writer.write(buffer, 0, n); } } finally { } return writer.toString(); }