我很难弄清楚如何拆分以下数组并将其转换为格式,因此我可以构建一个哈希的Active Record数组。
我的问题源于编写一个依赖Nokogiri从网上抓取信息的应用程序。我试图提取的表格的每一行中的数据被卡在一个<td>
元素中。每行只有一个<td>
元素。
修改
第一个网页包含一个包含几百个项目的<ul>
列表以及指向其详细信息页面的链接。我遍历每个项目,使用链接访问详细信息页面进行解析。我正在解析的表元素来自详细信息页面。如果查看split_array
的输出,我会给出第一行(第1级)的完整数据,然后是第二行(第2级)的一部分,以表明它在结构上是相同的但不是值。解决第一行的问题,解决了所有6行的问题。
<td>
Level 1
<br>
Attribute A: 24%
<br>
Attribute B: 14%
<br>
Attribute C: 15.5%
</td>
我设法以下列格式获取数据作为数组数组。我通过使用以下代码分割长字符串来完成此操作:
row.xpath('tr').each_with_index do |td, j|
split_array << td.text.squish.split('%')
end
以下是split_array
的部分输出:
[["Level: 1 Attribute A: 24", "Attribute B: 14", "Attribute C: 15.5"],["Level: 2 Atribute A: 36", ..etc]..etc]
我需要:
Level: 1
,Level: 2
... Attribute
名称和浮点值拆分为各自的字段将这些部分转换为类似于此的哈希数组:
[{:statistic => "Attribute A", :level_1 => 24.0, :level_2 =>36},{:statistic => "Attribute B", :level_1 => 14.0,:level_2 => 24},{:statistic => "Attribute C", :level_1 => 15.5, :level_2 => 34}]
我要求代码,伪代码或想法将我发送到正确的方向,将我的数组数组转换为我上面概述的哈希数组。
答案 0 :(得分:0)
1)我建议将它们存储在有意义的变量中,而不是在<td>
字符串中输入不同类型的信息然后解析它们。例如,将级别存储在1个变量中,将属性统计数组存储在另一个变量中,使用Nokogiri提供的解析工具获取它们。
2)关于这些字符串:
"Attribute B: 14"
这是一个包含并说明将解析它们的方法的脚本:
#!/usr/bin/env ruby
def parse_attr_string(s)
a = s.split
name = a[1].gsub(':', '')
value = a[2].gsub('%', '').to_f
[name, value]
end
s = "Attribute B: 14"
name, value = parse_attr_string(s)
puts "Name: #{name}, Value: #{value}" # Name: B, Value: 14.0
3)关于数据的重新组织,如果你有任何问题,如何试图弄清楚并以伪代码表达它然后发布你想出的内容?