0

我试图抓取到 CSV 数据库/Ruby 数组的页面列出了 470 个大小不一的组的总记录,每个组前面都有一个日期(总共 22 个唯一日期)。

我不知道该怎么做,因为组没有被组织到任何 HTML 表中,也没有在 DOM 中的任何层次结构中,“父”可能导致每个组的日期,只有<div class="line">可见记录 div 的干列表,有时前面只有a<span class="date">Thursday, May 24, 2012</span>保存仅适用于下 X 条记录的日期,直到打印新日期。

irb其中正确显示:

$page = $agent.get(pageurl) # gets page with Mechanize
doc = $page.parser # returns Nokogiri::HTML 

(records = doc.search('html body div#wrapper div#innerwrapper div#content div.line')).size 
=> 470
(dates = doc.search('html body div#wrapper div#innerwrapper div#content span.date')).size 
=> 22

例如显示第一个日期:

doc.search('html body div#wrapper div#innerwrapper div#content span.date')[0].text
=> "Wednesday, May 23, 2012"

我的目标是将正确的日期作为字段附加到上面找到的 470条记录doc.search 中,然后保存到 CSV 文件中。

Nokogiri(或 Mechanize)可以帮助我根据它们在 DOM 中的位置分组检索这些记录,即紧随其后dates[N].text但在下一个之前<span class="date">

我可以将 N 从 0 迭代到 21,附加到所有 470 条记录的主数组/CSV 对象,但对于每个组,添加适当的date字段。

4

2 回答 2

1

首先,您可以稍微简化一下搜索。由于 content 是一个id,并且它根据定义唯一标识该特定div,因此您不需要任何前面的路径信息。

records = doc.search('div#content div.line')

preceding-sibling从每条记录中,您可以使用 xpath 的轴提取日期。共:

doc.search('div#content div.line').each do |record|
  date = record.xpath('preceding-sibling::span[@class="date"][1]').text
  #append to CSV
end

XPath 表示:在同一级别 ( preceding-sibling::span) 中找到具有“日期”类( ) 的前面的跨度[@class="date"],并取第一个这样的跨度 ( [1]) 以确保您获得最近的日期跨度)。

于 2012-05-22T11:51:01.207 回答
1

这是另一个使用 traverse 的好时机:

doc.traverse do |node|
  @date = node.text if 'span' == node.name && 'date' == node[:class]
  puts [@date, node.text].join(', ') if 'div' == node.name && 'line' == node[:class]
end
于 2012-05-22T14:13:11.287 回答