Как получить HTML-исходный код страницы из HTML-ссылки в Android?

StackOverflow https://stackoverflow.com/questions/2423498

  •  19-09-2019
  •  | 
  •  

Вопрос

Я работаю над приложением, которому необходимо получить исходный код веб-страницы по ссылке, а затем проанализировать HTML с этой страницы.

Не могли бы вы привести мне несколько примеров или отправных точек, на которые следует обратить внимание, чтобы начать писать такое приложение?

Это было полезно?

Решение

Вы можете использовать С помощью HttpClient чтобы выполнить HTTP GET и получить HTML-ответ, что-то вроде этого:

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

Другие советы

Я бы предложил jsoup ( суп ).

Согласно их веб-сайту:

Извлеките домашнюю страницу Википедии, преобразуйте ее в DOM и выберите заголовки из раздела "В новостях" в список элементов (онлайн-образец):

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

Приступая к работе:

  1. Скачать базовая библиотека jsoup jar
  2. Прочтите кулинарная книга Введение

Этот вопрос немного устарел, но я решил, что должен опубликовать свой ответ сейчас, когда DefaultHttpClient, HttpGet, и т.д.являются устаревшими.Эта функция должна получать и возвращать HTML с заданным 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) {

}
}

Если вы взглянете здесь или здесь, вы увидите, что вы не можете сделать это напрямую с помощью Android API, вам нужна внешняя библиотека...

Вы можете выбрать между двумя приведенными выше, если вам нужна внешняя библиотека.

Назовите это так

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

Один из других ИТАК сообщение с ответом помогло мне.Это не читается построчно;предположительно, html-файл содержал строку ноль в промежутке.В качестве предварительного условия добавьте эту зависимость от настроек проекта "com.koushikdutta.ion:ион:2.2.1" реализуйте этот код в Асинхронная задача.Если вы хотите, чтобы возвращенный - что - то- чтобы быть в потоке пользовательского интерфейса, передайте его во взаимный интерфейс.

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

        }
    });
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top