现在我正在从另一个URL获取数据...这是我的代码:
require 'rubygems'
require 'nokogiri'
html = page.body
doc = Nokogiri::HTML(html)
doc.encoding = 'utf-8'
rows = doc.search('//table[@id = "MainContent_GridView1"]//tr')
@details = rows.collect do |row|
detail = {}
[
[:car, 'td[1]/text()'],
[:article, 'td[2]/text()'],
[:group, 'td[3]/text()'],
[:price, 'td[4]/text()'],
].each do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end
detail
end
@details
我试图通过数组而不是哈希来进行。但是我遇到了很多错误...有什么想法吗?我需要另一种方法...
我也将数据(此结果哈希)设置在此处的另一辆车上:
oem_art = []
@constr_num.each do |o|
as_oem = get_from_as_oem(o.ARL_SEARCH_NUMBER)
if as_oem.present?
oem_art << as_oem
end
end
@oem_art = oem_art.to_a.uniq
您是否只想将哈希人更改为数组?如果是这样,只需在哈希上使用to_a
方法。
hash = {:a => "something", :b => "something else"}
array = hash.to_a
array.inspect #=> [[:a, "something"], [:b, "something else"]]
看起来您正在寻找ruby中的hash.key之类的东西
Hash类不支持.key
符号,默认情况下,OpenStruct从Hash创建对象,因此您可以使用点符号访问属性。总体而言,它基本上只是句法糖。
建议的代码(来自链接答案)
>> require 'ostruct'
=> []
>> foo = {'bar'=>'baz'}
=> {"bar"=>"baz"}
>> foo_obj = OpenStruct.new foo
=> #<OpenStruct bar="baz">
>> foo_obj.bar
=> "baz"
因此,在您的示例中,您可以做:
# Initialised somewhere
require 'ostruct'
DETAIL_INDICES = {
:car => 1,
:article => 2,
:group => 3,
:price => 4,
}
# ** SNIP **
@details = rows.map do |row|
DETAIL_INDICES.inject({}) do |h,(k,v)|
h.merge(k => row.at_xpath("td[#{v}]/text()").to_s.strip)
end
end.collect { |hash| OpenStruct.new hash }
@details.each do |item|
puts item.car
end
当然,如果是一个问题,您可以合并地图(它们是相同的),但这只是基本语义差异的小分离,尽管我通常只使用map
来保持一致性,因此请随时选择你自己:)
编辑 - 简化的编辑中的其他代码
@oem_art = @constr_num.select do |item|
as_oem = get_from_as_oem(item.ARL_SEARCH_NUMBER)
as_oem.present?
end
puts @oem_art.uniq