Если элементы start и stop имеют одного и того же родителя, это так же просто, как один XPath. Сначала я покажу это с упрощенным документом для ясности, а затем с вашим образцом документа:
XML = "<root>
<a/><a1/><a2/>
<b/><b1/><b2/>
<c/><c1/><c2/>
</root>"
require 'nokogiri'
xml = Nokogiri::XML(XML)
# Find all elements between 'a' and 'c'
p xml.xpath('//*[preceding-sibling::a][following-sibling::c]').map(&:name)
#=> ["a1", "a2", "b", "b1", "b2"]
# Find all elements between 'a' and 'b'
p xml.xpath('//*[preceding-sibling::a][following-sibling::b]').map(&:name)
#=> ["a1", "a2"]
# Find all elements after 'c'
p xml.xpath('//*[preceding-sibling::c]').map(&:name)
#=> ["c1", "c2"]
Теперь вот ваш вариант использования (поиск по индексу):
HTML = "<h1> Header is here</h1>
<h2>Header 2 is here</h2>
<p>Extract me!</p>
<p>Extract me too!</p>
<h2> Next Header 2</h2>
<p>not interested</p>
<p>not interested</p>
<h2>Header 2 is here</h2>
<p>Extract me three!</p>
<p>Extract me four!</p>"
require 'nokogiri'
html = Nokogiri::HTML(HTML)
# Find all elements between the first and second h2s
p html.xpath('//*[preceding-sibling::h2[1]][following-sibling::h2[2]]').map(&:content)
#=> ["Extract me!", "Extract me too!"]
# Find all elements between the third h2 and the end
p html.xpath('//*[preceding-sibling::h2[3]]').map(&:content)
#=> ["Extract me three!", "Extract me four!"]