现在我从另一个网址获取数据... 这是我的代码:
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
答案 0 :(得分:1)
您是否只想将哈希值更改为数组?如果是这样,只需在哈希上使用to_a
方法。
hash = {:a => "something", :b => "something else"}
array = hash.to_a
array.inspect #=> [[:a, "something"], [:b, "something else"]]
答案 1 :(得分:0)
看起来你正在寻找像hash['key'] to hash.key in Ruby
这样的东西 Hash类默认情况下不支持.key
表示法,OpenStruct会从Hash创建一个Object,因此您可以使用点表示法来访问属性。总的来说,它基本上只是具有开销的语法糖。
建议的代码(来自链接的答案)
>> 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&amp; collect(它们是相同的),但这只是基本语义差异的一个小的分离,虽然我通常只使用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