Библиотека Ruby «Механизация» использует библиотеку разбора Nokogiri, поэтому вы можете напрямую вызывать Nokogiri. Одно из возможных решений может выглядеть примерно так:
require 'mechanize'
require 'pp'
html = "<h1>Hello1</h1>
<p>World1</p>
<h1>Hello2</h1>
<p>World2</p>
<h1>Hello2</h1>
<p>World2</p>"
results = []
Nokogiri::HTML(html).xpath("//h1").each do |header|
p = header.xpath("following-sibling::p[1]").text
results << [header.text, p]
end
pp results
EDIT:
Этот пример был протестирован с Mechanize v2.0.1, который использует Nokogiri ~ v1.4. Я также протестировал напрямую с Nokogiri v1.5.0 без проблем.
РЕДАКТИРОВАТЬ # 2:
Этот пример отвечает на дополнительный вопрос к исходному решению:
require 'nokogiri'
require 'pp'
html = <<HTML
<h1>
<p>
<font size="4">
<b>abide by (something)</b>
</font>
</p>
</h1>
<p>
<font size="3">- to follow the rules of something</font>
</p>
The cleaning staff must abide by the rules of the school.
<br>
<h1>
<p>
<font size="4">
<b>able to breathe easily again</b>
</font>
</p>
</h1>
<p>
My friend was able to breathe easily again when his company did not go bankrupt.
<br>
HTML
doc = Nokogiri::HTML(html)
results = []
Nokogiri::HTML(html).xpath("//h1").each do |header|
h1 = header.xpath("following-sibling::p/font/b").text
results << h1
end
pp results
H1
теги с вложенными элементами недопустимы, поэтому Nokogiri исправляет ошибку в процессе анализа. Процесс получения ранее вложенных элементов очень похож на исходное решение.