Парсер погоды (Java)

693
29 декабря 2016, 06:55

Задача :

Вывести на экран список из 10 городов с текущей температурой окружающей среды. Список вывести по алфавиту.

Отдельно вывести список городов, где сейчас идёт снег (или дождь, или пасмурно, или солнечно).

Также вести на экран, сколько времени выполнялась программа.

Мой ход решения :

Выбрал сайт : http://www.travel.ru/weather/russia/

Подключил библиотеку : jsoup

Не получается :

Вытащить из тега tr имя города и поместить его в переменную.

Вытащить прогноз погоды и поместить его в переменную.

В общем, Хьюстон, у нас проблемы.

Мой код :

package devjatnadcat;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public class Devjatnadcat1{
    public static void main(String[] args) throws IOException {
        List<Article> articleList = new ArrayList<>();
        Document doc = Jsoup.connect("http://travel.ru/weather/russia/").get();
        Elements trElements = doc.getElementsByAttributeValue("class", "b-table_row b-forecast");
        trElements.forEach(trElement ->{
            Element 
        });
    }
}
class Article{
    private String url;
    private String name;
    public Article(String url,String name){
        this.url=url;
        this.name=name;
    }
    public String getUrl(){
        return url;
    }
    public void setUrl(){
        this.url=url;
    }
    public String getName(){
        return name;
    }
    public void setName(){
        this.name=name;
    }
}
Answer 1

Не очень понимаю в чём проблема, но если сделать так:

trElements.forEach(trElement ->{
    Elements elementsByClass = trElement.getElementsByClass("b-table_cell"); // выбираем элементы по классу b-table_cell
    System.out.print(elementsByClass.get(0).text() + " "); // первая колонка - Город
    // Парсим вторую колонку
    Element element = elementsByClass.get(1);
    String temp = element.getElementsByClass("b-forecast_temp").text(); // температура
    String precipitation = element.getElementsByClass("b-forecast_description").text(); // осадки
    System.out.println(temp + " " + precipitation);
});

То вывод будет:

Ялта +1 / -1 снег
Иркутск -8 / -17 ясно
Красная Поляна +4 / 0 возможен дождь
Якутск -34 / -36 облачно
Мурманск -1 / -4 переменная облачность
Выборг +2 / +1 снег
Салехард -18 / -25 переменная облачность
Южно-Сахалинск -9 / -19 облачно с прояснениями
Ростов Великий -4 / -6 облачно
Армавир +1 / 0 облачно

Дальше можно идти глубже и разбирать каждую колонку, вытаскивать градусы и осадки отдельно. Про то как работать с JSOUP можно почитать тут.

Answer 2
/*
*Вывести на экран список из 10 городов с текущей температурой окружающей среды.
Список вывести по алфавиту.
Отдельно вывести список городов, где сейчас идет снег(или дождь, или пасмурно,
или солнечно).
Также вести на экран сколько времени выполнялась программа
*/
package devjatnadcat;
/**
 *
 * @author Марат
 */
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Devjatnadcat1{
    public static void main(String[] args) throws IOException {
    long m = System.currentTimeMillis()/1000;
    List<Article> articleList = new ArrayList<>();
    Document doc = Jsoup.connect("http://travel.ru/weather/russia/").get();
    Elements trElements = doc.getElementsByAttributeValue("class", "b-table_row b-forecast");
     trElements.forEach(trElement ->{
     Elements elementsByClass = trElement.getElementsByClass("b-table_cell"); // выбираем элементы по классу b-table_cell
     System.out.print(elementsByClass.get(0).text() + " "); // первая колонка - Город
     // Парсим вторую колонку
     Element element = elementsByClass.get(1);
      String temp = element.getElementsByClass("b-forecast_temp").text(); // температура
      String precipitation = element.getElementsByClass("b-forecast_description").text(); // осадки
      System.out.println(temp);
     });
     System.out.println("");
     trElements.forEach(trElement ->{
     Elements elementsByClass = trElement.getElementsByClass("b-table_cell"); // выбираем элементы по классу b-table_cell
     System.out.print(elementsByClass.get(0).text() + " - "); // первая колонка - Город
     // Парсим вторую колонку
     Element element = elementsByClass.get(1);
     String temp = element.getElementsByClass("b-forecast_temp").text(); // температура
     String precipitation = element.getElementsByClass("b-forecast_description").text(); // осадки
     System.out.println(precipitation);
     });
    System.out.println("Время выполнения : "+((double) (System.currentTimeMillis() - m)));
    }
}

class Article{
    private String url;
    private String name;
    public Article(String url,String name){
        this.url=url;
        this.name=name;
    }
    public String getUrl(){
        return url;
    }
    public void setUrl(){
        this.url=url;
    }
    public String getName(){
        return name;
    }
    public void setName(){
        this.name=name;
    }
}
READ ALSO
Главный поток медленнее дополнительного ? что делается в главном потоке андроид смартфона

Главный поток медленнее дополнительного ? что делается в главном потоке андроид смартфона

Вот игровой цикл, перед тем как рисовать, блокируем канвас, рисуем и потом разблокируем и видим кадрКак я понял принцип такой

449
Тонкости Espresso

Тонкости Espresso

Пробую писать на espresso with cucumberИ в одном из примеров наткнулся на такую строчку:

454