web-dev-qa-db-fra.com

Comment obtenir la source HTML d'une page à partir d'un lien HTML dans Android?

Je travaille sur une application qui doit extraire la source d'une page Web à partir d'un lien, puis analyser le code HTML de cette page. 

Pourriez-vous me donner des exemples ou des points de départ sur lesquels chercher pour commencer à écrire une telle application?

25
Praveen

Vous pouvez utiliser HttpClient pour effectuer un HTTP GET et récupérer la réponse HTML, à peu près comme ceci:

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();
45
Mark B

Je suggérerais jsoup .

Selon leur site web:

Récupérez la page d'accueil Wikipedia, analysez-la dans un DOM et sélectionnez les titres de la section Dans les nouvelles dans une liste d'éléments (exemple en ligne):

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

Commencer:

  1. Téléchargement la bibliothèque de base de jsoup jar
  2. Lire le livre de cuisine introduction
16
Spipau

Cette question est un peu ancienne, mais je me suis dit que je devrais poster ma réponse maintenant que DefaultHttpClient, HttpGet, etc. Cette fonction devrait obtenir et renvoyer du HTML, à partir d'une 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();
}
14
Colin White
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) {

}
}
6
Julian

Un des autres SO messages post m'a aidé. Cela ne lit pas ligne par ligne; à supposer que le fichier html comporte une ligne null entre les deux. Prérequis, ajoutez cette dépendance à partir des paramètres du projet "com.koushikdutta.ion: ion: 2.2.1" implémentez ce code dans AsyncTASK. Si vous voulez que le - quelque chose- retourné soit dans le thread de l'interface utilisateur, transmettez-le à une interface mutuelle.

Ion.with(getApplicationContext()).
load("https://google.com/hashbrowns")
.asString()
.setCallback(new FutureCallback<String>()
 {
        @Override
        public void onCompleted(Exception e, String result) {
            //int s = result.lastIndexOf("user_id")+9;
            // String st = result.substring(s,s+5);
           // Log.e("USERID",st); //something

        }
    });
0
Anupam Rajanish

Si vous regardez ici ou ici , vous verrez que vous ne pouvez pas le faire directement avec l'API Android, vous avez besoin d'une librairie externe ...

Vous pouvez choisir entre les 2 que voici si vous avez besoin d’une librairie externe.

0
Sephy

Appelez ça comme 

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
Xar E Ahmer