I am trying to always find the first <ul> that comes after <h2>, preferrably without looping, using a single Jsoup select() statement.
For example, that <ul> can be a sibling of <h2> as shown in this HTML snippet:
<!-- lots of things can come before -->
<h2 class="C" id="S3">
<button class="B">Click Me</button>
<span id="targetSpan">Target Span</span>
</h2>
<ul>
<li> List item 1</li>
<li> List item 2</li>
</ul>
<!-- lots of things can come after -->
Or it can be a descendant (not necessarily a direct child!) of a sibling of <h2>. The sibling may or may not be the first sibling element after <h2>, but <ul> is always the first <ul> after that <h2>. For example:
<!-- lots of things can come before -->
<h2 class="C" id="S3">
<button class="B">Click Me</button>
<span id="targetSpan">Target Span</span>
</h2>
<div>
<ul>
<li> List item 1</li>
<li> List item 2</li>
</ul>
</div>
<!-- lots of things can come after -->
I can find the <h2> easily:
Element h2 = select("h2 > span#targetSpan").first().parent();
But once I have h2, how do I find the first <ul> after it? (could be sibling or descendant, I don’t control that HTML code)
You can’t avoid your own loop. You must iterate through all next element siblings until you find the next
<ul>: