2010-03-11 9 views
23

Estoy trabajando en una aplicación que necesita obtener el origen de una página web desde un enlace, y luego analizar el html desde esa página.¿Cómo obtener la fuente html de una página desde un enlace html en android?

¿Podría darme algunos ejemplos o puntos de partida donde buscar para comenzar a escribir tal aplicación?

+0

¿No está del todo claro qué es lo que quieres hacer? Supongo que quieres obtener la página web y luego analizar el html? – Janusz

+0

estoy trabajando en el análisis html. primera tarea que quiero obtener fuente html desde mi enlace html. ¿como hacer eso? lo siento por mi peor inglés. gracias por animarme – Praveen

+0

No hubo problema intenté reformular tu pregunta un poco. Espero que todavía es la misma pregunta :) Para más preguntas, su pregunta es muy amplia. Nos gustan las preguntas que son un poco más especiales y tienen un solo problema en su aplicación, quizás con algún código de ejemplo para explicar su problema ... – Janusz

Respuesta

44

Se puede utilizar para realizar una HttpClient HTTP GET y recuperar la respuesta HTML, algo como esto:

HttpClient client = new DefaultHttpClient(); 
HttpGet request = new HttpGet(url); 
HttpResponse response = client.execute(request); 

String html = ""; 
InputStream in = response.getEntity().getContent(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
StringBuilder str = new StringBuilder(); 
String line = null; 
while((line = reader.readLine()) != null) 
{ 
    str.append(line); 
} 
in.close(); 
html = str.toString(); 
+2

Para mal, recibo una excepción de host desconocido, pero puedo abrir un navegador en mi misma URL. – Rhyous

+9

También obtuve la excepción de host desconocido, para mí era un problema de derechos, agregué esto '\t ' al manifiesto – Michel

+0

¿Hay alguna forma de leer todo el contenido? en un solo paso, sin leer línea por línea? – Mehmed

0

Si usted tiene una mirada here o here, verá que no puede hacerlo directamente con la API de Android, es necesario un librairy externa ...

Se puede elegir entre el 2 aquí está aquí anteriormente si necesita un librairy externo.

+1

que depende del tipo de página web que tenga y desee analizar.Si solo está buscando algunos valores específicos, puede tomar estos valores con una expresión regular :) Solo usaría una nueva lib externa si el caso de uso para esa biblioteca es lo suficientemente complicado como – Janusz

+0

. Regex es bastante fácil de usar, pero luego debes cargar toda la página y tomar cada etiqueta que te interese con una expresión regular personalizada, ¿no? – Sephy

+0

antes de usar regex necesitamos obtener la fuente html como una cadena. ¿como hacer eso? – Praveen

6
public class RetrieveSiteData extends AsyncTask<String, Void, String> { 
@Override 
protected String doInBackground(String... urls) { 
    StringBuilder builder = new StringBuilder(100000); 

    for (String url : urls) { 
     DefaultHttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     try { 
      HttpResponse execute = client.execute(httpGet); 
      InputStream content = execute.getEntity().getContent(); 

      BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
      String s = ""; 
      while ((s = buffer.readLine()) != null) { 
       builder.append(s); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    return builder.toString(); 
} 

@Override 
protected void onPostExecute(String result) { 

} 
} 
+0

funciona pero es muy lento ... – Nepster

16

Yo sugeriría jsoup.

Según su sitio web:

recuperar la página principal de Wikipedia, analizarlo a un DOM, y seleccionar los titulares de la En la sección de noticias en una lista de elementos (muestra en línea):

Document doc = Jsoup.connect("http://en.wikipedia.org/").get(); 
Elements newsHeadlines = doc.select("#mp-itn b a"); 

Introducción:

  1. Download la biblioteca jsoup núcleo frasco
  2. Leer el cookbook introducción
  3. ¡Disfrútalo!

divertirse, Paul

0

llamar así

new RetrieveFeedTask(new OnTaskFinished() 
     { 
      @Override 
      public void onFeedRetrieved(String feeds) 
      { 
       //do whatever you want to do with the feeds 
      } 
     }).execute("http://enterurlhere.com"); 

RetrieveFeedTask.class

class RetrieveFeedTask extends AsyncTask<String, Void, String> 
{ 
    String HTML_response= ""; 

    OnTaskFinished onOurTaskFinished; 


    public RetrieveFeedTask(OnTaskFinished onTaskFinished) 
    { 
     onOurTaskFinished = onTaskFinished; 
    } 
    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... urls) 
    { 
     try 
     { 
      URL url = new URL(urls[0]); // enter your url here which to download 

      URLConnection conn = url.openConnection(); 

      // open the stream and put it into BufferedReader 
      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

      String inputLine; 

      while ((inputLine = br.readLine()) != null) 
      { 
       // System.out.println(inputLine); 
       HTML_response += inputLine; 
      } 
      br.close(); 

      System.out.println("Done"); 

     } 
     catch (MalformedURLException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     return HTML_response; 
    } 

    @Override 
    protected void onPostExecute(String feed) 
    { 
     onOurTaskFinished.onFeedRetrieved(feed); 
    } 
} 

OnTaskFinished.java

public interface OnTaskFinished 
{ 
    public void onFeedRetrieved(String feeds); 
} 
+0

¿Dónde defino 'url_search' y 'HTML_Resonse'? – user1091524

+0

Además, ¿qué hace Parser (feed)? ¿referencia? Alt_Enter no encuentra el analizador de clase. – user1091524

+0

Corrija estos errores 'No puedo resolver el símbolo' HTML_Resonse'' y 'No puedo resolver el método' Analizador (java.lang.String) '' @Nepster – Florida

12

Esta pregunta es un poco antigua, pero pensé que debería publicar mi respuesta ahora que DefaultHttpClient, HttpGet, etc. están en desuso. Esta función debería obtener y devolver HTML, dada una URL.

public static String getHtml(String url) throws IOException { 
    // Build and set timeout values for the request. 
    URLConnection connection = (new URL(url)).openConnection(); 
    connection.setConnectTimeout(5000); 
    connection.setReadTimeout(5000); 
    connection.connect(); 

    // Read and store the result line by line then return the entire string. 
    InputStream in = connection.getInputStream(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    StringBuilder html = new StringBuilder(); 
    for (String line; (line = reader.readLine()) != null;) { 
     html.append(line); 
    } 
    in.close(); 

    return html.toString(); 
} 
+0

¿podría decirme cómo enviar esta información de la función a webview onload of mainActivity? – user1788736

Cuestiones relacionadas