Извлечение текста между двумя тегами ‹hr› в HTML без CSS

Использование Jsoup, что было бы оптимальным подходом для извлечения текста, шаблон которого известен ([number]%%[number]), но находится на HTML-странице, которая не использует ни CSS, ни div, span, классы или другую идентификацию любого типа (ага, старая HTML-страница над которыми я не властен)?

Единственное, что постоянно идентифицирует этот текстовый сегмент (и гарантированно останется таковым), это то, что HTML всегда выглядит так (внутри большей части HTML):

<hr>
2%%17
<hr>

(Числа 2 и 17 приведены только в качестве примеров. Это могут быть любые числа, и на самом деле это две переменные, которые мне нужно надежно извлечь из этой HTML-страницы).

Если бы этот текст находился в охватывающих и однозначно идентифицирующих <span> или <div>, у меня не было бы проблем с извлечением его с помощью Jsoup. Проблема в том, что это не тот случай, и единственный способ, который я могу придумать прямо сейчас (который вообще не элегантен), состоит в том, чтобы обрабатывать необработанный HTML с помощью регулярное выражение

Однако обработка необработанного HTML с помощью регулярного выражения кажется неэффективной, потому что я уже проанализировал его с помощью Jsoup в DOM.

Предложения?


person ef2011    schedule 02.09.2011    source источник
comment
Вы пытались отладить элемент jsoup, чтобы увидеть, есть ли элементы?   -  person ariel    schedule 03.09.2011
comment
@ariel Да, элементы есть, но они не заключают в себе элементы, поэтому я не могу использовать element.text() для получения столь желанного [number]%%[number]. :)   -  person ef2011    schedule 03.09.2011
comment
@ariel Проблема в том, что [number]%%[number] не является элементом. Итак, на данный момент мой обходной путь состоит в том, чтобы взять body.html() и передать его через регулярное выражение, которое идентифицирует описанный выше шаблон. Но я открыт для более элегантных решений.   -  person ef2011    schedule 03.09.2011
comment
значит элемента нет. он не анализируется как элемент, он находится только в теле   -  person ariel    schedule 03.09.2011
comment
Этот шаблон встречается в HTML несколько раз? Или только один раз?   -  person BalusC    schedule 03.09.2011
comment
@BalusC К счастью, этот шаблон встречается в HTML только один раз. В HTML довольно много элементов <hr>, но только один с шаблоном, который я цитировал в своем посте.   -  person ef2011    schedule 03.09.2011
comment
Между <hr>s нет других элементов? Даже без <p>? Просто <hr>blahblah 2%%17 blahblah</hr>?   -  person BalusC    schedule 03.09.2011


Ответы (1)


Как насчет этого?

Document document = Jsoup.connect(url).get();
Elements hrs = document.select("hr");
Pattern pattern = Pattern.compile("(\\d+%%\\d+)");

for (Element hr : hrs) {
    String textAfterHr = hr.nextSibling().toString();
    Matcher matcher = pattern.matcher(textAfterHr);

    while (matcher.find()) {
        System.out.println(matcher.group(1)); // <-- There, your data.
    }
}
person BalusC    schedule 02.09.2011
comment
В этом решении, безусловно, больше jsoup, но, поскольку ему все равно приходится прибегать к регулярному выражению, теперь возникает вопрос, будет ли передача body.HTML() через регулярное выражение быстрее. - person ef2011; 03.09.2011
comment
Вы ищете шаблоны внутри текстового узла. Jsoup мало что может для вас сделать, так как это не средство сопоставления регулярных выражений. - person BalusC; 03.09.2011
comment
Конечно. Но теперь мне любопытно, работает ли цикл через часы быстрее, чем регулярное выражение верхнего уровня. - person ef2011; 03.09.2011
comment
Что-то вроде (‹hr›)\s*(\d+)%%(\d+)\s*(‹hr›) - person ef2011; 03.09.2011
comment
Regex, по крайней мере, будет быстрее, если строка для сопоставления будет как можно меньше. Прохождение через него всего документа, а не только наименьших возможных фрагментов, в отношении которых вы уверены, что они могут содержать нужные вам данные, обойдется дороже. - person BalusC; 03.09.2011