Без примера HTML наша способность предоставить работающее решение действительно ограничена.
Это должно дать вам отправную точку для работы с:
require 'nokogiri'
html = <<EOT
<html>
<body>
<div>
<p><b>Name:</b> JOHN DOE / COMPANY NAME</p>
<p><b>Status:</b> ACTIVE</p>
<p><b>Date Joined:</b> 2007-08-17</p>
<p><b>Address:</b> 123 MAIN STREET</p>
<p><b>City:</b> ANYTOWN <b>State/Territory/Other:</b> NEW YORK <b>Country:</b> US</p>
<p><b>Postal Code/Zip Code:</b> 10101</p>
</div>
</body>
</html>
EOT
doc = Nokogiri::HTML(html)
data = doc.search('div').map { |div|
name = div.at('//p[1]').text[/:(.+)/, 1].strip
status = div.at('//p[2]').text[/:(.+)/, 1].strip
date_joined = div.at('//p[3]').text[/:(.+)/, 1].strip
address = div.at('//p[4]').text[/:(.+)/, 1].strip
city_state_country = div.at('//p[5]').text
postal_code = div.at('//p[6]').text[/:(.+)/, 1].strip
city, state, country = (city_state_country.match(%r{City:(.+) State/Territory/Other:(.+) Country:(.+)}).captures).map{ |s| s.strip }
{
:name => name,
:status => status,
:date_joined => date_joined,
:address => address,
:city => city,
:state => state,
:country => country,
:postal_code => postal_code
}
}
Полученный результат выглядит следующим образом:
require 'pp'
pp data
# >> [{:name=>"JOHN DOE / COMPANY NAME",
# >> :status=>"ACTIVE",
# >> :date_joined=>"2007-08-17",
# >> :address=>"123 MAIN STREET",
# >> :city=>"ANYTOWN",
# >> :state=>"NEW YORK",
# >> :country=>"US",
# >> :postal_code=>"10101"}]
Если вы хотите массив массивов, используйте это в блоке карты:
[
name,
status,
date_joined,
address,
city,
state,
country,
postal_code
]
, который будет генерировать:
# >> [["JOHN DOE / COMPANY NAME",
# >> "ACTIVE",
# >> "2007-08-17",
# >> "123 MAIN STREET",
# >> "ANYTOWN",
# >> "NEW YORK",
# >> "US",
# >> "10101"]]
Альтернативный способ поиска, который, как мне кажется, легче поддерживать, поскольку он более СУХОЙ, это:
data = doc.search('div').map { |div|
name,
status,
date_joined,
address,
city,
state,
country,
postal_code = [
'Name',
'Status',
'Date Joined',
'Address',
'City',
'State/Territory/Other',
'Country',
'Postal Code/Zip Code'
].map { |t|
div.at( %Q(//p/b[text()="#{t}:"]) ).next.text.strip
}