Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
#1

Вытянуть информацию с кода страницы сайта - Android

30.08.2016, 15:10. Просмотров 393. Ответов 20

Всем привет! Нашел пример в интернете как сделать простое приложение, которое считывает температуру с сайта. По кнопке Button обновляет температуру, а в TextView отображаем ее. Пытаюсь сделать его рабочим, но все без успешно - ничего не выводит. Скажите, что не так.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.example.marymistan.temperature;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.*;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button btnRefreshTemperature = (Button) findViewById(R.id.btnRefreshTemperature);
 
        btnRefreshTemperature.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View view){
                RefreshTemper();
            }
        });
        RefreshTemper();
    }
 
    public String GetTemper(String urlsite) // функция загрузки температуры
    {
        String matchtemper = "";
        try
        {
            URL url = new URL(urlsite);
            URLConnection conn = url.openConnection();
            InputStreamReader rd = new InputStreamReader(conn.getInputStream());
            StringBuilder allpage = new StringBuilder();
            int n = 0;
            char[] buffer = new char[40000];
            while (n >= 0)
            {
                n = rd.read(buffer, 0, buffer.length);
                if (n > 0)
                {
                    allpage.append(buffer, 0, n);
                }
            }
 
            final Pattern pattern = Pattern.compile
                    ("^<li><b>Текущая:([-+0-9])°C</b></li>$");
            Matcher matcher = pattern.matcher(allpage.toString());
            if (matcher.find()){
                matchtemper = matcher.group(1);
            }
            return matchtemper;
        }
        catch (Exception e){
        }
        return matchtemper;
    }
 
    private void RefreshTemper(){
        final TextView textTemperature = (TextView) findViewById(R.id.textTemperature);
        String bashtemp = "";
        bashtemp = GetTemper("http://belmeteo.net/");
        textTemperature.setText(bashtemp.concat("°"));
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fraley
101 / 101 / 36
Регистрация: 24.05.2015
Сообщений: 309
30.08.2016, 15:20     Вытянуть информацию с кода страницы сайта #2
Цитата Сообщение от MrMistan Посмотреть сообщение
Пытаюсь сделать его рабочим, но все без успешно - ничего не выводит.
И нет никаких исключений?
Типа android.os.NetworkOnMainThreadException?

Тут уже неоднократно писали на форуме, работа с сетью не в основном потоке.
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
30.08.2016, 15:31  [ТС]     Вытянуть информацию с кода страницы сайта #3
да я читал такое, но плохо соображаю, как это применить.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class HTMLGet extends AsyncTask<String,Void,Void>
    {
    @Override
    public void onPreExecute()
    {
    //Обновление интерфейса до начала получения html
    }
 
    @Override
    public Void doInBackground(String... params)
    {
    //HTTP запрос
    return null;
    }
 
 
    @Override
    public void onPostExecute(Void result)
    {
    //Обновление интерфейса после получения html
    }
    }
Паблито
2195 / 1809 / 562
Регистрация: 12.05.2014
Сообщений: 6,445
Завершенные тесты: 1
30.08.2016, 15:37     Вытянуть информацию с кода страницы сайта #4
у него там в блоке catch глотается исключение
если добавить e.printStackTrace();
то можно будет увидеть вживую android.os.NetworkOnMainThreadException

Добавлено через 38 секунд
Цитата Сообщение от MrMistan Посмотреть сообщение
да я читал такое, но плохо соображаю
тебе надо за тебя все сделать или попытаешься почитать и сделать самостоятельно?
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
30.08.2016, 16:36  [ТС]     Вытянуть информацию с кода страницы сайта #5
читал я, но не соображаю (

для Вас спецов 1 минутку это состряпать, если не сложно помогите.
Паблито
2195 / 1809 / 562
Регистрация: 12.05.2014
Сообщений: 6,445
Завершенные тесты: 1
30.08.2016, 17:29     Вытянуть информацию с кода страницы сайта #6
если не сильно вдаваться в то, что парсить страницу можно другими способами, а не в лоб, регуляркой, то сойдет
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    private static final String URL = "http://belmeteo.net/";
    private static final int TIMEOUT = 20000;
    private Button btnRefreshTemperature;
    private TextView textTemperature;
    private String result;
    private final Runnable updateAction = new Runnable() {
        @Override
        public void run() {
            btnRefreshTemperature.setEnabled(true);
            textTemperature.setText(String.format("Температура: %s", result));
        }
    };
    private final Runnable getTempAction = new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL(URL);
                URLConnection conn = url.openConnection();
                conn.setConnectTimeout(TIMEOUT);
                conn.setReadTimeout(TIMEOUT);
                conn.connect();
                final InputStreamReader isr = new InputStreamReader(conn.getInputStream(), "windows-1251");
                BufferedReader reader = new BufferedReader(isr);
                StringBuilder sb = new StringBuilder();
 
                String line;
                while ((line = reader.readLine()) != null) sb.append(line);
                line = sb.toString();
                final Pattern pattern = Pattern.compile("<li><b>Текущая: ([-+.0-9]+)°C</b></li>");
                Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    result = matcher.group(1);
                } else {
                    result = "Что-то со страницей, не парсится.";
                }
            } catch (Exception e) {
                e.printStackTrace();
                result = "Ошибка подключения.";
            }
            btnRefreshTemperature.post(updateAction);
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnRefreshTemperature = (Button) findViewById(R.id.btnRefreshTemperature);
        btnRefreshTemperature.setOnClickListener(this);
        textTemperature = (TextView) findViewById(R.id.textTemperature);
        refreshTemper();
    }
 
    public void getTemper() {
        new Thread(getTempAction).start();
    }
 
    private void refreshTemper() {
        btnRefreshTemperature.setEnabled(false);
        getTemper();
    }
 
    @Override
    public void onClick(View view) {
        refreshTemper();
    }
}
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
30.08.2016, 19:10  [ТС]     Вытянуть информацию с кода страницы сайта #7
Спасибо!)
Но у меня все равно косяк, когда регулярное выражение пишу так:
Java
1
 final Pattern pattern = Pattern.compile("Температура воздуха</p>\\n<ul>\\n<li><b>Текущая: ?-?\\d?\\d?\\.?\\d°C");
хочу сделать группу 1, добавляя скобки (), но подчеркивает это выражение:
Java
1
 final Pattern pattern = Pattern.compile("Температура воздуха</p>\\n<ul>\\n<li><b>Текущая: (?-?\\d?\\d?\\.?\\d°C)");
Что не правильно?
Паблито
2195 / 1809 / 562
Регистрация: 12.05.2014
Сообщений: 6,445
Завершенные тесты: 1
30.08.2016, 19:13     Вытянуть информацию с кода страницы сайта #8
у меня в примере есть регулярка, религия не позволяет ее скопировать?
регулярки начинающего должны волновать меньше всего
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
30.08.2016, 19:40  [ТС]     Вытянуть информацию с кода страницы сайта #9
я не понимаю как у тебя распознается точка в числе?
Паблито
2195 / 1809 / 562
Регистрация: 12.05.2014
Сообщений: 6,445
Завершенные тесты: 1
30.08.2016, 19:57     Вытянуть информацию с кода страницы сайта #10
все что между квадратными скобками [-+.0-9] можно читать так - или знак минус или плюс или точка или цифры от 0 до 9
причем все что перечислено может идти в любом количестве, например под это уловие попадет что-то типа .666-777+5
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
31.08.2016, 09:03  [ТС]     Вытянуть информацию с кода страницы сайта #11
Спасибо, я понял в [] перечисленные символы , а потом знак + это любое количество.

А можешь теперь подсказать, где тут реализованы потоки?
Это?
Java
1
2
3
conn.setConnectTimeout(TIMEOUT);
conn.setReadTimeout(TIMEOUT);
conn.connect();
fraley
101 / 101 / 36
Регистрация: 24.05.2015
Сообщений: 309
31.08.2016, 09:35     Вытянуть информацию с кода страницы сайта #12
MrMistan, нет.
О потоках:
http://developer.alexanderklimov.ru/...ory/thread.php
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
31.08.2016, 11:13  [ТС]     Вытянуть информацию с кода страницы сайта #13
А можешь последний раз подсказать. Я со всех сайтов могу выдергивать так инфу?

Вот пытаюсь еще с одного сайта http://www.meteoinfo.by/wrf15/?city=26850

меняю URL:
Java
1
private static final String URL = "http://www.meteoinfo.by/wrf15/?city=26850";
добавляю считывание времени и беру час:
Java
1
2
Date d = new Date();
int hours = d.getHours();
и регулярка приобретает вид:
Java
1
final Pattern pattern = Pattern.compile("^"+hours+" ч</sup></td>\n\n<td>([-+.0-9])+</td>$");
Но где то косяк.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
01.09.2016, 10:01     Вытянуть информацию с кода страницы сайта #14
"^" это символ начала строки, а в коде так:
<td colspan='2'>день<sup id='itallic'>+10 ч</sup></td>
И вообще гуглите regex online и эксперементируйте.
fraley
101 / 101 / 36
Регистрация: 24.05.2015
Сообщений: 309
01.09.2016, 10:27     Вытянуть информацию с кода страницы сайта #15
MrMistan, а какую цель вы преследуете?
Учебная - парсить именно таким образом или нужно получить прогноз погоды?
Если второе, есть более простые и эффективные способы.
Например бесплатный(но с определенными ограничениями) API от OpenWeatherMap:
http://openweathermap.org/api
Единственное за прошедшие время на сайте произошли изменения и для работы с этим API требуются ключ.
Но все что надо это зарегистрироваться.
vxg
01.09.2016, 11:38
  #16

Не по теме:

Цитата Сообщение от Паблито Посмотреть сообщение
если добавить e.printStackTrace();
то можно будет увидеть вживую android.os.NetworkOnMainThreadException
кстати, в этом самом стеке иногда вижу отличную подсказку вплоть до строки где произошла беда а иногда какую то лабудень про зиготу какую-то и вообще про методы ко мне отношения не имеющие - как сие понять ?

Паблито
01.09.2016, 11:42
  #17

Не по теме:

я всегда интуитивно смотрю ) начиная с самого верха
в крашлитикс часто прилетают ошибки и там нажимаешь show full stack и получаешь простыню на 15 страниц

vxg
01.09.2016, 11:51
  #18

Не по теме:

Паблито, тоже телепатирую, но жаль, думал вы откроете тайну зиготы)

MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
01.09.2016, 18:46  [ТС]     Вытянуть информацию с кода страницы сайта #19
я через этот сайт и делал их(на сайте все ищут), но в приложении не работают
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2016, 09:53     Вытянуть информацию с кода страницы сайта
Еще ссылки по теме:

Android Передать информацию вызывающему классу
Получение html кода страницы Android
Как скопировать информацию с сайта и вставить её в приложение? Android
Android Отпарсить страничку, вытянуть кусок кода между комментариями
Android Доступ из HTML кода страницы, загруженной в WebView, к данным приложения

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
_Night_Scream_
57 / 69 / 7
Регистрация: 08.08.2013
Сообщений: 560
02.09.2016, 09:53     Вытянуть информацию с кода страницы сайта #20
MrMistan, есть книжка Android для разработчиков. 3-е издание
Там 7ая глава вам в тему, всё разжевано.

Не по теме:

она есть на просторах интернета

Yandex
Объявления
02.09.2016, 09:53     Вытянуть информацию с кода страницы сайта
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru