Jsoup: Извлечение всего HTML между двумя блоками в HTML без CSS - PullRequest
7 голосов
/ 05 сентября 2011

Что было бы оптимальным способом, используя Jsoup, извлечь весь HTML (либо в строку, документ или элементы) между двумя блоками, которые соответствуют этому шаблону:

<strong>
 {any HTML could appear here, except for a <strong> pair}
</strong>

 ...
 {This is the HTML I need to extract. 
  any HTML could appear here, except for a <strong> pair}
 ... 

<strong>
 {any HTML could appear here, except for a <strong> pair}
</strong>

Используя регулярное выражение, это может быть просто, если я применю его ко всему body.html ():

(<strong>.+</strong>)(.+)(<strong>.+</strong>)
                       ^
                       +----- There I have my HTML content

Но, как я узнал из подобной задачи , производительность могла бы быть улучшена (даже если код немного длиннее), если бы я использовал уже обработанный Jsoup DOM - за исключением того, что на этот раз ни Element.nextSibling() ни Element.nextElementSibling() не может прийти на помощь.

Я искал что-то вроде jQuery nextUntil в Jsoup, например, но не смог найти что-то похожее.

Возможно ли придумать что-то лучшее, чем описанный выше подход на основе регулярных выражений?

1 Ответ

5 голосов
/ 04 ноября 2011

Не знаю, быстрее ли это, но, может быть, что-то вроде этого будет работать:

Elements strongs = doc.select("strong");
Element f = strongs.first();
Element l = strongs.last();
Elements siblings = f.siblingElements();
List<Element> result = siblings.subList(siblings.firstIndexOf(f) + 1,siblings.lastIndexOf(l));
...