htree + rexml で フル XPathを使う
htree は柔軟というかpermissiveだと謳われているのでスクレイピングにはちょうどよさげ。 hpricotは全然xpathをサポートしていなかったのでこのhtree+rexmlを使う。
require "rexml/document" require 'htree' doc = HTree('<div><p>abc</p><div><p>def</p><p>ghi</p></div><p>jkl</p></div>').to_rexml names = REXML::XPath.match(doc, '//p[text()="def"]/following-sibling::p') puts names
結果
<p>ghi</p>
オッケーです!