Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11

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

30.08.2016, 15:10. Показов 1714. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.08.2016, 15:10
Ответы с готовыми решениями:

Отпарсить страничку, вытянуть кусок кода между комментариями
Всем привет. Такой вопрос, есть html страница, необходимый мне кусок кода заключен в 2х комментариях ( &lt;!--ON--&gt; и &lt;!--OFF--&gt;)....

Вытянуть информацию из сайта
Добрый день, есть сайт https://my-shop.ru нужно зная ISBN книги осуществить запрос на поиск на сайте и скопировать описание и фото в БД....

Как можно, например из сайта gmail из исходного кода вытянуть пустой ли ящик !?
Хочу написать программу какая будет проверять есть ли там письма .? может кто то делал, или это не возможно !? дайте совет ).Раньше...

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

Тут уже неоднократно писали на форуме, работа с сетью не в основном потоке.
1
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
30.08.2016, 15:31  [ТС]
да я читал такое, но плохо соображаю, как это применить.
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
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.08.2016, 15:37
у него там в блоке catch глотается исключение
если добавить e.printStackTrace();
то можно будет увидеть вживую android.os.NetworkOnMainThreadException

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

для Вас спецов 1 минутку это состряпать, если не сложно помогите.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.08.2016, 17:29
если не сильно вдаваться в то, что парсить страницу можно другими способами, а не в лоб, регуляркой, то сойдет
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
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
30.08.2016, 19:10  [ТС]
Спасибо!)
Но у меня все равно косяк, когда регулярное выражение пишу так:
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
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.08.2016, 19:13
у меня в примере есть регулярка, религия не позволяет ее скопировать?
регулярки начинающего должны волновать меньше всего
1
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
30.08.2016, 19:40  [ТС]
я не понимаю как у тебя распознается точка в числе?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.08.2016, 19:57
все что между квадратными скобками [-+.0-9] можно читать так - или знак минус или плюс или точка или цифры от 0 до 9
причем все что перечислено может идти в любом количестве, например под это уловие попадет что-то типа .666-777+5
1
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
31.08.2016, 09:03  [ТС]
Спасибо, я понял в [] перечисленные символы , а потом знак + это любое количество.

А можешь теперь подсказать, где тут реализованы потоки?
Это?
Java
1
2
3
conn.setConnectTimeout(TIMEOUT);
conn.setReadTimeout(TIMEOUT);
conn.connect();
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
31.08.2016, 09:35
MrMistan, нет.
О потоках:
http://developer.alexanderklim... thread.php
1
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 11
31.08.2016, 11: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
914 / 562 / 88
Регистрация: 13.02.2014
Сообщений: 2,082
01.09.2016, 10:01
"^" это символ начала строки, а в коде так:
<td colspan='2'>день<sup id='itallic'>+10 ч</sup></td>
И вообще гуглите regex online и эксперементируйте.
1
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
01.09.2016, 10:27
MrMistan, а какую цель вы преследуете?
Учебная - парсить именно таким образом или нужно получить прогноз погоды?
Если второе, есть более простые и эффективные способы.
Например бесплатный(но с определенными ограничениями) API от OpenWeatherMap:
http://openweathermap.org/api
Единственное за прошедшие время на сайте произошли изменения и для работы с этим API требуются ключ.
Но все что надо это зарегистрироваться.
1
01.09.2016, 11:38

Не по теме:

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

0
01.09.2016, 11:42

Не по теме:

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

0
01.09.2016, 11:51

Не по теме:

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

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

Не по теме:

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

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2016, 09:53
Помогаю со студенческими работами здесь

Как можно, например из сайта gmail из исходного кода вытянуть пустой ли ящик !?
Хочу написать программу какая будет проверять есть ли там письма .? может кто то делал, или это не возможно !? дайте совет ).Раньше...

Как вытащить нужную информацию из кода страницы?
Имеется Url. Код страницы примерно такой: ... &lt;div id='one_id'&gt; &lt;div class='one_class'&gt; &lt;div class='two_class'&gt; ...

Выделить из html кода страницы информацию, ссылки, картинки и положить в файл
Здравствуйте У меня есть задача: выделить из html кода страницы информацию, ссылки, картинки и положить в файл Чем мне пользоваться?...

Загрузка кода страницы с сайта в эксель
Добрый день. Есть задача: извлечь информацию с некоторых страниц из интернета. Пользуюсь таким скриптом для передачи кода страницы в...

Как взять информацию из кода другой страницы чтоб ипользовать ее в своем скрипте для работы с ней
мне нужно взять некоторие слова из определенной ячейки на некотором сайте и присвоить к своей переменной в скрипте для последющих автомат....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru