5.5 Результати перетворення типу

Перетворення типу (механізм Formatter) є розширені функціональні можливості у WebMagic 0.3.2. Оскільки зміст завжди повертається у рядку String, але ми хочемо мати у іншому типі динних. Formatter може екстрактовані дані автоматично перетворити в кілька основних типів без необхідності вручну прописувати код для перетворення.

Наприклад:

@ExtractBy("//ul[@class='pagehead-actions']/li[1]//a[@class='social-count js-social-count']/text()")
private int star;

5.5.1 Підтримка автоматичної конвертації типів даних

Автоматична конвертація підтримує всі базові типів даних та їх типи класів-обгорток.

Primitive packing type
int Integer
long Long
double Double
float Float
short Short
char Character
byte Byte
boolean Boolean

Крім того, він підтримує перетворення типу у java.util.Date. Проте, при перетворенні потрібно вказати формат дати. Формат відповідно до стандарту JDK визначені конкретними нормами, докладніше тут: http://java.sun.com/docs/books/tutorial/i18n/format/simpleDateFormat.html

@Formatter("yyyy-MM-dd HH:mm")
@ExtractBy("//div[@class='BlogStat']/regex('\\d+-\\d+-\\d+\\s+\\d+:\\d+')")
private Date date;

5.5.2 Явно зазначити конвертацію типів

При нормальних обставинах, Formatter будуть перетворені у відповідності з типом поля, але при особливих обставинах, нам потрібно буде зазначити вказати тип. Це інколи відбувається переважно в полі типу list - список.

@Formatter(value = "",subClazz = Integer.class)
@ExtractBy(value = "//div[@class='id']/text()", multi = true)
private List<Integer> ids;

5.5.3 Кастомний Formatter (TODO)

Насправді, на додаток до автоматичних перетворенням типу, Formatter також може робити деякі речі, щоб обробити результати. Наприклад, у нас є необхідний сценарій, результати повинні бути екстрактованими, в результаті екстракт подрібнюється на частини мозаїки, з якиїх складається необхідний рядок. Тут ми визначаємо шаблон формату рядку StringTemplateFormatter.

public class StringTemplateFormatter implements ObjectFormatter<String> {

    private String template;

    @Override
    public String format(String raw) throws Exception {
        return String.format(template, raw);
    }

    @Override
    public Class<String> clazz() {
        return String.class;
    }

    @Override
    public void initParam(String[] extra) {
        template = extra[0];
    }
}

Ну, ми можемо, після екстракції зробити деякі прості операції!

@Formatter(value = "author is %s",formatter = StringTemplateFormatter.class)
@ExtractByUrl("https://github\\.com/(\\w+)/.*")
private String author;

Ця фіча у версії 0.4.3 має баг BUG, але буде виправлено у 0.5.0

results matching ""

    No results matching ""