Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
153 / 153 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
1

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

05.07.2013, 14:41. Показов 2041. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2013, 14:41
Ответы с готовыми решениями:

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

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

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

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

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

Не по теме:

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

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

Если на первой странице ничего дельного не обнаружено - с высокой вероятностью нет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2013, 20:26

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

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

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

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


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

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

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