Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1

Parse HTML c использованием JSoup. Оценка оптимальности

05.07.2013, 14:41. Показов 2504. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Постановка задачи: необходимо по заданной дате получить с сайта http://cbr.ru/ данные по курсу золота для последующей загрузки в базу.

Для решения задачи был использован класс Currency:
class Currency
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
import java.util.Date;
 
public final class Currency {
    private Date date;
    private int number;
    private String code;
    private int measure;
    private String name;
    private double rate;
    
    public Currency(
            Date aDate,
            int aNumber, 
            String aCode, 
            int aMeasure, 
            String aName, 
            double aRate) {
        date = aDate;
        number = aNumber;
        code = aCode;
        measure = aMeasure;
        name = aName;
        rate = aRate;
    }
    
    public Currency(Date aDate, int aNumber, double aRate) {
        date = aDate;
        number = aNumber;
        rate = aRate;
    }
    
    @Override
    public String toString() {
        final String DATE_PATTERN = "%1$td.%1$tm.%1$tY";
        return String.format(DATE_PATTERN, date) + ": " + number + ": " + rate;
    }
    
    public Date getDate()  {
        return date;
    }
    
    public int getNumber() {
        return number;
    }
    
    public double getRate() {
        return rate;
    }
}


И загрузчик следущего вида:
CurrRateLoader
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public static Currency getGoldRate(Date loadDate) throws IOException {       
        final String DATE_PATTERN = "%1$td.%1$tm.%1$tY";
        final String URL_PATTERN = 
                "http://cbr.ru/metall_base/New_dynamics.asp?" +
                "r1=0&date_req1=" + DATE_PATTERN + 
                "&date_req2=" + DATE_PATTERN + "&m1=1";
        final int GOLD_CODE = 998;
        String path = String.format(URL_PATTERN, loadDate);
        Document doc = Jsoup.connect(path).get();
        
        Elements dateElements = doc.getElementsMatchingText(
                String.format(DATE_PATTERN,loadDate));
        //We assume, that last date on this page is met in a table cell
        Element dateTableCell = dateElements.last();
        Element rateTableCell = dateTableCell.nextElementSibling();
        double goldRate = Double.parseDouble(rateTableCell.text()
                .replace("*","")
                .replace(",", "."));
        Currency gold = new Currency(loadDate, GOLD_CODE, goldRate);        
        return gold;
    }


Для разбора структуры HTML документа использовалась библиотека JSoup
Но смущает одно. В структуре HTML-страницы с курсом золота (например) я не нашел какого-то признака у таблицы. Поэтому приходится использовать достаточно кривую схему: находить последний элемент HTML, в котором находится дата загрузки (в рассчете на то, что именно этот элемент соседствует с курсом валюты), брать его соседа и загружать его содержимое.

Так как с HTML и JSoup я начал разбираться совсем недавно, есть подозрение, что я упустил какой-нибудь более простой способ. Есть ли он?

Добавлено через 5 минут
UPD: форум криво обрабатывает ссылки с амперсандом почему-то, так что там надо будет кнопочку "получить" нажать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2013, 14:41
Ответы с готовыми решениями:

Jsoup качает всю страницу целиком? или только html (без картинок, css и т.д.)?
"тащю" кусок div по id. Как измерить трафик? Jsoup выкачивает только исходный код, без "бесполезных" картинок? использую: ...

Парсинг html, Jsoup
У меня есть страница логов в формате Профиль/Клан/Действие. Мне нужно вытащить оттуда все ники профилей. Хотел вытащить сначала все теги...

HTTP Status 500 - java.lang.NoClassDefFoundError: org/jsoup/Jsoup
Добавил библиотеку в pom, все нормально импортируется. Но в рантайме кидает ошибку: "Handler processing failed; nested exception is...

4
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.07.2013, 19:58
Перестаньте парсить cbr.ru как HTML. Он умеет отдавать данные другими, более простыми способами, например XML - http://www.cbr.ru/scripts/Root.asp?Prtid=SXML
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
05.07.2013, 20:04  [ТС]
turbanoff, wow.
Спасибо)
Но все равно хотелось бы понять, правильно ли я отпарсил.
0
05.07.2013, 20:25

Не по теме:

Цитата Сообщение от turbanoff Посмотреть сообщение
Он умеет отдавать данные другими, более простыми способами, например XML - http://www.cbr.ru/scripts/Root.asp?Prtid=SXML
А есть универсальный способ узнать, умеет ли такое определенный сайт?

0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
05.07.2013, 20:26  [ТС]
google.com -> XML site:<siteName>

Если на первой странице ничего дельного не обнаружено - с высокой вероятностью нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2013, 20:26
Помогаю со студенческими работами здесь

Оценка оптимальности порядка фильтра
Добрый день. Есть сигнал sin(x) и случайная составляющая с нормальным распределением. Сигнал сглаживаем с помощью фильтра Простое...

POST авторизация с использованием JSOUP
Вот собственно и у меня дедлок случился)) Ситуация следующая, пытаюсь залогиниться на joy.reactor.cc package...

jsoup, парсинг html
А почему не работает такой простой код? Парсинг из инета пока не трогаем... Код: package com.example.projecta; import...

Parse error-PHP+HTML
Здравствуйте, помогите пожалуйста понять в чем ошибка, скорее всего в синтаксисе, но я в упор не вижу ее:( На строку 6 смотрела, уже...

Parse веб-страницы (HTML)
Здравствуйте друзья и к делу: 1 Как спарсить текст из &quot;адресной строки&quot;(или от сюда(P.S. смотри миниатюру 1))? 2 Как написать...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru