Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
1

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

30.08.2016, 15:10. Просмотров 617. Ответов 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("°"));
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2016, 15:10
Ответы с готовыми решениями:

API Авито вытянуть информацию об объявлении
Всем привет. Появилась нужда вытянуть информацию об объявлении, но при частом...

Отпарсить страничку, вытянуть кусок кода между комментариями
Всем привет. Такой вопрос, есть html страница, необходимый мне кусок кода...

Как скопировать информацию с сайта и вставить её в приложение?
На фотографиях не мое приложение, интересует создание такого приложения....

Получение кода страницы
Приложение закрывается после нажатия на кнопку почему? public class...

Извлечение кода из страницы WebView
Здравствуйте. Есть страница загруженная WebView с кодом авторизации, который...

20
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
30.08.2016, 15:20 2
Цитата Сообщение от MrMistan Посмотреть сообщение
Пытаюсь сделать его рабочим, но все без успешно - ничего не выводит.
И нет никаких исключений?
Типа android.os.NetworkOnMainThreadException?

Тут уже неоднократно писали на форуме, работа с сетью не в основном потоке.
1
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
    }
    }
0
Pablito
2722 / 2165 / 735
Регистрация: 12.05.2014
Сообщений: 7,572
Завершенные тесты: 1
30.08.2016, 15:37 4
у него там в блоке catch глотается исключение
если добавить e.printStackTrace();
то можно будет увидеть вживую android.os.NetworkOnMainThreadException

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

для Вас спецов 1 минутку это состряпать, если не сложно помогите.
0
Pablito
2722 / 2165 / 735
Регистрация: 12.05.2014
Сообщений: 7,572
Завершенные тесты: 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();
    }
}
1
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)");
Что не правильно?
0
Pablito
2722 / 2165 / 735
Регистрация: 12.05.2014
Сообщений: 7,572
Завершенные тесты: 1
30.08.2016, 19:13 8
у меня в примере есть регулярка, религия не позволяет ее скопировать?
регулярки начинающего должны волновать меньше всего
1
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
30.08.2016, 19:40  [ТС] 9
я не понимаю как у тебя распознается точка в числе?
0
Pablito
2722 / 2165 / 735
Регистрация: 12.05.2014
Сообщений: 7,572
Завершенные тесты: 1
30.08.2016, 19:57 10
все что между квадратными скобками [-+.0-9] можно читать так - или знак минус или плюс или точка или цифры от 0 до 9
причем все что перечислено может идти в любом количестве, например под это уловие попадет что-то типа .666-777+5
1
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();
0
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
31.08.2016, 09:35 12
MrMistan, нет.
О потоках:
http://developer.alexanderklimov.ru/android/theory/thread.php
1
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>$");
Но где то косяк.
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,074
01.09.2016, 10:01 14
"^" это символ начала строки, а в коде так:
<td colspan='2'>день<sup id='itallic'>+10 ч</sup></td>
И вообще гуглите regex online и эксперементируйте.
1
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
01.09.2016, 10:27 15
MrMistan, а какую цель вы преследуете?
Учебная - парсить именно таким образом или нужно получить прогноз погоды?
Если второе, есть более простые и эффективные способы.
Например бесплатный(но с определенными ограничениями) API от OpenWeatherMap:
http://openweathermap.org/api
Единственное за прошедшие время на сайте произошли изменения и для работы с этим API требуются ключ.
Но все что надо это зарегистрироваться.
1
vxg
01.09.2016, 11:38
  #16

Не по теме:

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

0
Pablito
01.09.2016, 11:42
  #17

Не по теме:

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

0
vxg
01.09.2016, 11:51
  #18

Не по теме:

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

0
MrMistan
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
01.09.2016, 18:46  [ТС] 19
я через этот сайт и делал их(на сайте все ищут), но в приложении не работают
0
_Night_Scream_
80 / 77 / 11
Регистрация: 08.08.2013
Сообщений: 631
02.09.2016, 09:53 20
MrMistan, есть книжка Android для разработчиков. 3-е издание
Там 7ая глава вам в тему, всё разжевано.

Не по теме:

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

1
02.09.2016, 09:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2016, 09:53

Получение html кода страницы
Помогите разобраться с получением html кода интернет страницы в приложении...

Получение кода web страницы
Не могу получить код web страницы: runOnUiThread(new Runnable() { ...

Ошибка при парсинге страницы сайта
В методе онклик пишу: public void onClick(View v) { Document...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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