Android - анализировать веб-контент - PullRequest
0 голосов
/ 09 мая 2020

Я новичок в android. Я пытаюсь создать приложение, которое получает исходный код веб-страницы, получает URL-адреса всех изображений в нем, а их заголовки объявления отображают его в виде изображения. Хотя я могу получить исходный код, текст, который я получаю, кажется каким-то слитным текстом, и поэтому я не могу найти URL-адреса в тексте. Что мне делать, чтобы получить расширенную версию исходного кода.

'' '

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {
    ArrayList<Bitmap> imageSet;
    ArrayList<String> names;

    String sourceCode;

    protected class SourceCodeDownloader extends AsyncTask<String, Void, String >{

        @Override
        protected String doInBackground(String... urls) {
            URL url;
            HttpURLConnection connection;
            try {
                 url= new URL(urls[0]);
                 connection= (HttpURLConnection) url.openConnection();
                InputStream in = connection.getInputStream();
                InputStreamReader reader= new InputStreamReader(in);
                int data= reader.read();
                while(data!=-1){
                    sourceCode+=(char)data;
                    data=reader.read();
                }

                return sourceCode;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }
    }


    protected class ImageDownloader extends AsyncTask<String, Void, Bitmap >{

        @Override
        protected Bitmap doInBackground(String... urls) {

            try {
                URL url= new URL(urls[0]);
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                connection.connect();
                InputStream in = connection.getInputStream();
                Bitmap img= BitmapFactory.decodeStream(in);
                return img;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageSet= new ArrayList<>(); names= new ArrayList<>(); sourceCode="";
        SourceCodeDownloader sourceCodeDownloader= new SourceCodeDownloader();
        try {
            sourceCode=sourceCodeDownloader.execute("https://www.ranker.com/list/forbes-100-most-powerful-celebrities/worlds-richest-people-lists").get();
        } catch (Exception e) {
            e.printStackTrace();
        }
        /*
        Pattern p= Pattern.compile("<img src=\"(.*?)\"");
        Pattern q= Pattern.compile("title=\"(.*?)\"");
        Matcher m=p.matcher(sourceCode);
        Matcher n=q.matcher(sourceCode);
        ImageDownloader imageDownloader= new ImageDownloader();
        while(m.find()){
                try {
                    Bitmap img= imageDownloader.execute(m.group(1)).get();
                    imageSet.add(img);

                } catch (Exception e) {
                    e.printStackTrace();
                }
        }
        while(n.find()) {
            try {
                String name = m.group(1);
                names.add(name);

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

        Log.i("done", sourceCode);
        /*
        Log.i("done", String.valueOf(imageSet.size())+" "+String.valueOf(names.size()));
        */


    }
}

'''

Это журнал, который я получаю. По сути, я получаю весь заголовок исходного кода, но подзаголовки отсутствуют, и поэтому я не могу получить желаемый URL-адрес изображения. Что делать?

<!DOCTYPE html>
    <!--
     /$$$$$$$                      /$$
    | $$__  $$                    | $$
    | $$  \ $$  /$$$$$$  /$$$$$$$ | $$   /$$  /$$$$$$   /$$$$$$
    | $$$$$$$/ |____  $$| $$__  $$| $$  /$$/ /$$__  $$ /$$__  $$
    | $$__  $$  /$$$$$$$| $$  \ $$| $$$$$$/ | $$$$$$$$| $$  \__/
    | $$  \ $$ /$$__  $$| $$  | $$| $$_  $$ | $$_____/| $$
    | $$  | $$|  $$$$$$$| $$  | $$| $$ \  $$|  $$$$$$$| $$
    |__/  |__/ \_______/|__/  |__/|__/  \__/ \_______/|__/
     -->
    <html lang="en" xmlns:og="//opengraphprotocol.org/schema/" xmlns:fb="//www.facebook.com/2008/fbml"> <head> <link rel="dns-prefetch" href="//prd.rnkr-static.com/146"> <link rel="dns-prefetch" href="//api.ranker.com"> <link rel="dns-prefetch" href="https://imgix.ranker.com"/> <link rel="dns-prefetch" href="//imgix.ranker.com"> <link rel="dns-prefetch" href="https://fonts.googleapis.com/"> <link rel="dns-prefetch" href="//fonts.gstatic.com"> <link rel="dns-prefetch" href="https://polyfill.io"> <link rel="dns-prefetch" href="//assets.adobedtm.com"> <link rel="dns-prefetch" href="//www.google-analytics.com"> <link rel="dns-prefetch" href="//www.facebook.com"> <link rel="dns-prefetch" href="//www.googletagmanager.com"> <link rel="dns-prefetch" href="//content.jwplatform.com"> <link rel="dns-prefetch" href="//pixel.quantserve.com"> <link rel="dns-prefetch" href="//cdn.yldbt.com"> <link rel="dns-prefetch" href="//www.googletagservices.com"> <link rel="dns-prefetch" href="//ox-d.ranker.servedbyopenx.com"> <link rel="dns-prefetch" href="//apex.go.sonobi.com"> <link rel="dns-prefetch" href="//ib.adnxs.com"> <link rel="dns-prefetch" href="//pagead2.googlesyndication.com"> <link rel="dns-prefetch" href="//assets.pinterest.com"> <link rel="dns-prefetch" href="cdn.petametrics.com"> <link rel="dns-prefetch" href="www.youtube.com"> <link rel="dns-prefetch" href="//adserver.adtechus.com"> <link rel="dns-prefetch" href="//btlr.sharethrough.com"> <link rel="dns-prefetch" href="https://cdn.rebel.ai"> <link rel="dns-prefetch" href="https://secure.rebel.ai"> <link rel="preconnect" href="//prd.rnkr-static.com/146"> <link rel="preconnect" href="//api.ranker.com"> <link rel="preconnect" href="https://imgix.ranker.com"/> <link rel="preconnect" href="//imgix.ranker.com"> <link rel="preconnect" href="https://fonts.googleapis.com/"> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://polyfill.io" crossorigin> <link rel="preconnect" href="//assets.adobedtm.com"> <link rel="preconnect" href="//www.google-analytics.com"> <link rel="preconnect" href="//s3.amazonaws.com"> <link rel="preconnect" href="//sync.bfmio.com"> <link rel="preconnect" href="//beacon.krxd.net"> <link rel="preconnect" href="//pre.ads.justpremium.com"> <link rel="preconnect" href="//pixel.quantserve.com"> <link rel="preconnect" href="//secure.quantserve.com"> <meta name="MobileOptimized" content="width"/> <meta name="HandheldFriendly" content="true"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=contain"/> <meta name="apple-mobile-web-app-capable" content="yes"/> <link rel="shortcut icon" href="/favicon.png"/> <link rel="apple-touch-icon" href="/touch-icon-iphone.png"> <link rel="apple-touch-icon" sizes="76x76" href="/touch-icon-ipad.png"> <link rel="apple-touch-icon" sizes="120x120" href="/touch-icon-iphone-retina.png"> <link rel="apple-touch-icon" sizes="152x152" href="/touch-icon-ipad-retina.png"> <meta name="msapplication-TileColor" content="#1E3E66"/> <meta name="msapplication-square150x150logo" content="/msapplication-square150x150logo.png"/> <meta name="theme-color" content="#ffffff"/> <!-- Open Graph Metadata --> <title>The Power 100 | Forbes 100 Most Powerful Celebrities </title> <meta name="description" content="The Power 100 list from Forbes contains the 100 most powerful people in Hollywood and the highest paid celebrities. The richest actors, actresses and media power players are here. These are the top richest people in the world of entertainment. M

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Чтобы получить все URL-адреса, вы можете использовать простое регулярное выражение:

 data-src=\"(.+?)\" class=

Итак, вот код, собирающий все URL-адреса:

Pattern pattern = Pattern.compile(" data-src=\"(.+?)\" class=");
Matcher matcher = pattern.matcher(content);

List<String> urls = new ArrayList<>();

while (matcher.find()) {
    String url = matcher.group(1);
    urls.add(url);
}

// Remove the last one (containg rest of the input)
urls.remove(urls.size() - 1);

// Show urls
for (String url : urls) {
    System.out.println(url);
}
0 голосов
/ 09 мая 2020

Я настоятельно рекомендую вам использовать библиотеку Jsoup, и вот пример того, как получить все изображения с trending__image в качестве имени класса

 String URL = "https://www.ranker.com/";


 @SuppressLint("StaticFieldLeak")
    public class fetchData extends AsyncTask<Integer, List<String>, List<String>> {
        Document doc = null;
        ArrayList<String> urls = new ArrayList<>();

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected List<String> doInBackground(final Integer... integers) {

            try {
                doc = Jsoup.connect(URL).get();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (doc != null) {
                Elements elements = doc.getElementsByClass("trending__image");
                for (Element element : elements) {
                    String url = element.attr("src");
                    urls.add(url);
                }
            }
            return urls;
        }


        @Override
        protected void onPostExecute(List<String> urls) {
            super.onPostExecute(urls);
            //
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...