Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1

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

05.07.2013, 14:41. Показов 2506. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru