Страницы

Поиск по вопросам

пятница, 21 июня 2019 г.

Выборка расписания с сайта - Java

Пытаюсь сделать приложение, которое будет парсить страницу с расписанием автобуса и выводить его.
Суть в том, чтобы расписание бралось первой остановки и если автобус будет не раньше, чем текущее время. То есть, если сейчас время 18:10, то надо вывести все оставшееся расписание с 18:10.
http://mybuses.ru/moscow/bus/734/
В идеале был бы показ только 3 автобусов, которые ближе всего к текущему времени.
class main extends AsyncTask{
String Bus1,Sys_time,wtf;
@Override protected Void doInBackground(Void... params) {
String table=""; String time; Integer first,second; final Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); Date date = cal.getTime(); Integer mHour = date.getHours(); Integer mMinute = date.getMinutes(); if(mMinute<10){ mMinute=date.getMinutes()+10; } String curr_time=mHour.toString()+":"+mMinute.toString();
Document doc; try { doc = Jsoup.connect("http://mybuses.ru/moscow/bus/734/").get(); Element table_site=doc.select("table").get(0); Element rows1=table_site.select("tr").get(1);
Iterator rowIterator=table_site.select("tr").iterator(); rowIterator.next(); Integer str1,str2,str3,str4;
while (rowIterator.hasNext()) { Element e = doc.select("tr").get(2); String e_1=e.attr("class"); str1=e_1.indexOf("-"); str2=e_1.indexOf(":"); str3=e_1.indexOf("-"); str4 = e_1.indexOf(":"); first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2))); second = Integer.parseInt(e_1.substring(str2+1, e_1.indexOf(str2+2)));
if (first>=mHour && second>=mMinute) { Element rows=table_site.select("tr").get(1); Element record1=rows.select("td").get(1); Iterator time1=record1.select("td").iterator(); wtf = time1.next().text(); } else { wtf="1232132132"; } } Element record2=rows1.select("td").get(6); Iterator time2=record2.select("td").iterator();
table="Автобус прибудет на Ст. Солнечная в "+wtf+" (через n минут)
Автобус прибудет на ГМС3 в "+time2.next().text(); } catch (IOException e) { e.printStackTrace(); }
Bus1=table; Sys_time=curr_time;
return null;
}
@Override protected void onPostExecute(Void result) { super.onPostExecute(result);
textView.setText("Текущее время: "+Sys_time+"

Расписание автобусов:
"+Bus1); } }
В этом коде ошибка:
Caused by: java.lang.StringIndexOutOfBoundsException: length=41; regionStart=23; regionLength=-24
в строке
first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2)));
Как ее можно исправить? В моей задумке было получить время из названия класса на сайте, т.к. в названии класса указано время первой остановки sh2 columnIsVisible 0-05:26-01-0002-0001, где 05:26 - время. Попытался вырезать это время и сравнить с текущим.


Ответ

Исключение вам английским языком говорит что вы вышли за границы строки.
А теперь попробуем разобрать фрагмент вашего кода.
str1 = e_1.indexOf("-"); ... ... first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2)));
в строке e_1 строка для парсинга. в целочисленной переменной str1 индекс символа - в переменную first хотим получить целое число, в которое преобразуется строка из двух символов после символа -
Тут все понятно. А вот дальше начинается интересное.
e_1.indexOf(str1+2) - тут вы пытаетесь найти индекс вхождения в исходную строку символа, который является суммой чисел от индекса str1+2. Т.е. собственно нелогичная и некорректная операция. Думаю что вполне можно заменить это просто нв str1+3. +3 - потому что конечный индекс не включается в результат операции.
Т.е. код должен быть.
first = Integer.parseInt(e_1.substring(str1+1, str1+3));
Аналогично и для получения переменной second

Комментариев нет:

Отправить комментарий