Вылетает jsoup-парсер веб страниц

212
01 мая 2018, 02:39

Я сделал парсер веб-страниц для своего андроид приложения, и он нормально работает, но через некоторое время вылетает. Ошибку вызывает блок кода, отвечающий за открытие ссылки и получение URL'а картинки оттуда, и я не могу понять, в чём проблема.

Картинки есть во всех новостях, которые он парсит, но он чем то недоволен. Как решить эту проблему? Код и логи прилагаю ниже:

MainActivity.class:

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
MyRecyclerViewAdapter adapter;
public Elements content;
public ArrayList<String> titleList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new NewThread().execute();
    new NewThread().execute();
    RecyclerView recyclerView = findViewById(R.id.rv_list);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    adapter = new MyRecyclerViewAdapter(this, titleList);
    adapter.setClickListener(this);
    recyclerView.setAdapter(adapter);
}
@Override
public void onItemClick(View view, int position) {
    Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
}
public class NewThread extends AsyncTask<String, Void, String> {
    String cleaner(String a){
        String source = a;
        String result = "";
        ArrayList<String> arr = new ArrayList<>();
        arr.add(source);
        for(String retrival: source.split(" ")){
            arr.add(retrival);
        }
        arr.remove(0);


        Iterator<String> iterator = arr.iterator();
        while (iterator.hasNext()) {
            String string = iterator.next();
            if (string.equals("Россия") || string.equals("Екатеринбург")) {
                iterator.remove();
            }else{
                result += string+" ";
            }
        }


        return result;
    }
    @Override
    protected String doInBackground(String... arg) {
        Document doc;
        try{
            doc= Jsoup.connect("https://www.znak.com/?&%D0%B5%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B1%D1%83%D1%80%D0%B3%20%D0%BC%D1%83%D0%B7%D0%B5").get();
            content = doc.select(".pub");
            int link_counter = 0;
            titleList.clear();
            for(Element contents: content){
                titleList.add(cleaner(contents.text()));
                String href = doc.getElementsByClass("pub").get(link_counter).attr("href");
              //  Log.d("parse", href); 
                String region = doc.getElementsByClass("region").get(link_counter).text();
              //  Log.d("Title", region);
                String time = doc.getElementsByTag("time").get(link_counter).attr("datetime");
              //  Log.d("Time", time);
//Блок кода ниже вызывает ошибку
                    Document doc2 = Jsoup.connect("https://www.znak.com"+href).get();
                String pic_url=doc2.getElementsByTag("img").get(link_counter).attr("src"); 
                Log.d("picture", pic_url+" "+contents.text());
                link_counter++;
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        adapter.notifyDataSetChanged();
    }
}
}

Логи:

04-29 14:19:54.849 6443-6443/? I/zygote: Not late-enabling -Xcheck:jni (already on)
04-29 14:19:54.861 6443-6443/? W/zygote: Unexpected CPU variant for X86 using defaults: x86
04-29 14:19:55.090 6443-6443/com.example.max.recyclerviewtesting I/InstantRun: starting instant run server: is main process
04-29 14:19:55.323 6443-6461/com.example.max.recyclerviewtesting D/NetworkSecurityConfig: No Network Security Config specified, using platform default
04-29 14:19:55.337 6443-6465/com.example.max.recyclerviewtesting D/OpenGLRenderer: HWUI GL Pipeline
04-29 14:19:55.370 6443-6465/com.example.max.recyclerviewtesting I/zygote: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
04-29 14:19:55.370 6443-6465/com.example.max.recyclerviewtesting I/OpenGLRenderer: Initialized EGL, version 1.4
04-29 14:19:55.370 6443-6465/com.example.max.recyclerviewtesting D/OpenGLRenderer: Swap behavior 1
04-29 14:19:55.371 6443-6465/com.example.max.recyclerviewtesting W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
04-29 14:19:55.371 6443-6465/com.example.max.recyclerviewtesting D/OpenGLRenderer: Swap behavior 0
04-29 14:19:55.382 6443-6465/com.example.max.recyclerviewtesting D/EGL_emulation: eglCreateContext: 0xa55af600: maj 3 min 0 rcv 3
04-29 14:19:55.407 6443-6465/com.example.max.recyclerviewtesting D/EGL_emulation: eglMakeCurrent: 0xa55af600: ver 3 0 (tinfo 0xafdaa640)
04-29 14:19:55.452 6443-6465/com.example.max.recyclerviewtesting D/EGL_emulation: eglMakeCurrent: 0xa55af600: ver 3 0 (tinfo 0xafdaa640)
04-29 14:19:56.102 6443-6448/com.example.max.recyclerviewtesting I/zygote: Do partial code cache collection, code=15KB, data=29KB
04-29 14:19:56.105 6443-6448/com.example.max.recyclerviewtesting I/zygote: After code cache collection, code=15KB, data=29KB
    Increasing code cache capacity to 128KB
04-29 14:19:56.934 6443-6461/com.example.max.recyclerviewtesting D/picture: //img.znak.com/logo-200x96.png Екатеринбург Не забыли, понимаешь Музей Ельцина в Екатеринбурге — во всех смыслах удивительное место
04-29 14:19:56.942 6443-6448/com.example.max.recyclerviewtesting I/zygote: Do partial code cache collection, code=60KB, data=45KB
    After code cache collection, code=60KB, data=45KB
    Increasing code cache capacity to 256KB
04-29 14:19:57.690 6443-6461/com.example.max.recyclerviewtesting D/picture: //img.znak.com/1397932.jpg Екатеринбург Музей истории Екатеринбурга ищет «око Саурона» для Водонапорной башни на Плотинке
04-29 14:19:58.229 6443-6461/com.example.max.recyclerviewtesting D/picture: https://img.znak.com/1856629.jpg Екатеринбург В Екатеринбурге музей конструктивизма вынужден отдать часть своих площадей швейному цеху
04-29 14:19:58.673 6443-6461/com.example.max.recyclerviewtesting D/picture:  Екатеринбург Музей Екатеринбурга раскрыл секрет памятника соратнику Ленина, расстрелявшему Николая II
04-29 14:20:01.250 6443-6461/com.example.max.recyclerviewtesting E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.example.max.recyclerviewtesting, PID: 6443
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:353)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.example.max.recyclerviewtesting.MainActivity$NewThread.doInBackground(MainActivity.java:117)
        at com.example.max.recyclerviewtesting.MainActivity$NewThread.doInBackground(MainActivity.java:54)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764) 
04-29 14:20:01.578 6443-6465/com.example.max.recyclerviewtesting D/EGL_emulation: eglMakeCurrent: 0xa55af600: ver 3 0 (tinfo 0xafdaa640)
04-29 14:20:02.211 6443-6472/com.example.max.recyclerviewtesting D/picture: //img.znak.com/logo-200x96.png Екатеринбург Не забыли, понимаешь Музей Ельцина в Екатеринбурге — во всех смыслах удивительное место
04-29 14:20:02.626 6443-6472/com.example.max.recyclerviewtesting D/picture: //img.znak.com/1397932.jpg Екатеринбург Музей истории Екатеринбурга ищет «око Саурона» для Водонапорной башни на Плотинке
04-29 14:20:05.327 6443-6472/com.example.max.recyclerviewtesting D/picture: https://img.znak.com/1856629.jpg Екатеринбург В Екатеринбурге музей конструктивизма вынужден отдать часть своих площадей швейному цеху
04-29 14:20:05.782 6443-6472/com.example.max.recyclerviewtesting D/picture:  Екатеринбург Музей Екатеринбурга раскрыл секрет памятника соратнику Ленина, расстрелявшему Николая II
04-29 14:20:08.338 6443-6472/com.example.max.recyclerviewtesting I/Process: Sending signal. PID: 6443 SIG: 9
Answer 1

Огромное спасибо woesss'у, его идея была правильной. Вот как должен работать тот участок кода:

String pic_url=doc2.getElementsByTag("img").get(1).attr("src");
READ ALSO
заполнение EditText по курсору через баттон

заполнение EditText по курсору через баттон

интересует возможность заполнение EditText'а по расположению курсора через buttonТо есть понятно что editText

166
Как получить строку из json файла

Как получить строку из json файла

Мне нужно из json достать строку из объекта из массива массивов(надеюсь правильно понимаю)Каким образом именно 7 индекс получить? желательно...

188
Напишите пожалуйста пример работы JScrollPane с JTextArea

Напишите пожалуйста пример работы JScrollPane с JTextArea

У меня не выходит вроде делаю все правильно, но компонент не видно

170
sampler2DArray - инициализация и использование

sampler2DArray - инициализация и использование

Изучаю OpenGL и столкнулся с необходимостью использовать sampler2DArrayВесь день мучаюсь - все без толку

193