Первое правило XPath: никогда не используйте автоматически сгенерированный XPath из Firebug или другого инструмента браузера.Это создает хрупкий XPath, который рассматривает все элементы страницы как одинаково важные и необходимые, даже те части, которые вам не нужны.Например, если в верхней части страницы появилось уведомление, и оно оказалось в таблице, оно может сойти с вашего разбора.
Вместо этого подумайте, как человек может его идентифицировать.В этом случае вы хотите «первую таблицу под заголовком со словом« сегодня »в ней».Вот XPath для этого:
//table[preceding-sibling::h2[contains(text(), "today")]][1]
Это говорит о том, что возьмите таблицы, которые имеют предшествующие h2
(другими словами, следующие за h2
), где h2
содержит слово «сегодня».».Затем возьмите первую такую таблицу.
Затем вам нужно определить интересующие вас строки. Обратите внимание, что некоторые строки являются просто разделителями, содержащими один td
, поэтому вы хотите убедиться, что разбираете только строкикоторые имеют несколько тегов td
.В XPath это:
//tr[td[2]]
Тогда вы просто захватываете содержимое всех столбцов.В первом вы можете удалить все до слов «величины», чтобы получить только значение.Собираем все вместе:
doc = Nokogiri::HTML.parse(html)
events = []
doc.xpath('//table[preceding-sibling::h2[contains(text(), "today")]][1]//tr[td[2]]').each do |row|
cols = row.search('td/text()').map(&:to_s)
events << {
:magnitude => cols[0].gsub(/^.*of magnitude /,''),
:temp_area => cols[1],
:time_start => cols[2],
:time_middle => cols[3],
:time_end => cols[4]
}
end
Вывод:
[
{:magnitude=>"F1.7",
:temp_area=>"0",
:time_start=>"01:11:00",
:time_middle=>"01:24:00",
:time_end=>"01:32:00"},
{:magnitude=>"F3.1",
:temp_area=>"0",
:time_start=>"04:01:00",
:time_middle=>"04:10:00",
:time_end=>"04:26:00"},
{:magnitude=>"F3.5",
:temp_area=>"134F55",
:time_start=>"06:24:00",
:time_middle=>"06:42:00",
:time_end=>"06:53:00"},
{:magnitude=>"F1.4",
:temp_area=>"0",
:time_start=>"11:58:00",
:time_middle=>"12:06:00",
:time_end=>"12:16:00"},
{:magnitude=>"F1.0",
:temp_area=>"0",
:time_start=>"13:02:00",
:time_middle=>"13:05:00",
:time_end=>"13:09:00"},
{:magnitude=>"D53.7",
:temp_area=>"134F55",
:time_start=>"17:37:00",
:time_middle=>"18:37:00",
:time_end=>"18:56:00"}
]