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>

オッケーです!