Вы можете использовать вспомогательный метод, такой как этот:
static IEnumerable<HtmlNode> FilteredTakeWhile(
HtmlNode root,
Func<HtmlNode, bool> predicate,
Func<HtmlNode, bool> takePredicate)
{
for (var currentNode = root.NextSibling;
currentNode != null && takePredicate(currentNode);
currentNode = currentNode.NextSibling)
{
if (predicate(currentNode))
yield return currentNode;
}
}
Затем использовать его:
var h3 = doc.DocumentNode.SelectSingleNode("h3");
// take all "p" nodes while we haven't reached the next "h3" node
var query = FilteredTakeWhile(h3, node => node.Name == "p", node => node.Name != "h3");