Question

Je travaille sur une application qui a besoin d'obtenir 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 où chercher pour commencer à écrire une telle application?

Était-ce utile?

La solution

Vous pouvez utiliser HttpClient pour effectuer une requête HTTP GET et récupérer la réponse HTML, quelque chose 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();

Autres conseils

Je suggère jsoup .

Selon leur site web:

Fetch la page d'accueil de Wikipédia, l'analyser un DOM, et sélectionnez les titres de la Dans la section de nouvelles dans une liste d'éléments (échantillon en ligne):

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

Mise en route:

  1. Télécharger la bibliothèque de base de pot de jsoup
  2. Lire le livre de recettes l'introduction

Cette question est un peu vieux, mais je me suis dit que je devrais poster ma réponse maintenant que DefaultHttpClient, HttpGet, etc. sont dépréciées. Cette fonction doit obtenir et retourner HTML, à l'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();
}
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) {

}
}

Si vous regardez ou < a href = « http://htmlparser.sourceforge.net/ » rel = « nofollow noreferrer »> ici , vous verrez que vous ne pouvez le faire directement avec l'API Android, vous avez besoin d'un externe .. librairie .

Vous pouvez choisir entre les 2 est ici si vous avez besoin ci-dessus une externe librairie.

Appel 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);
}

L'un des autres SO réponse post m'a aidé. Cela ne lit pas ligne par ligne; supposingly le fichier html avait une ligne null entre les deux. Comme condition sine qua non ajouter ce à partir des paramètres de dépendance du projet "com.koushikdutta.ion: ion: 2.2.1" mettre en œuvre ce code dans AsyncTask . Si vous voulez que le retour -quelque chose -. pour être dans le thread d'interface utilisateur, passer à 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

        }
    });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top