如何拆分字符串数组并转换为哈希数组

时间:2016-04-30 03:23:50

标签: ruby-on-rails ruby split nokogiri

我很难弄清楚如何拆分以下数组并将其转换为格式,因此我可以构建一个哈希的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]

我需要:

  1. 从每个数组中的第一个元素中删除Level: 1Level: 2 ...
  2. Attribute名称和浮点值拆分为各自的字段
  3. 将这些部分转换为类似于此的哈希数组:

    [{: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}]
    
  4. 我要求代码,伪代码或想法将我发送到正确的方向,将我的数组数组转换为我上面概述的哈希数组。

1 个答案:

答案 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)关于数据的重新组织,如果你有任何问题,如何试图弄清楚并以伪代码表达它然后发布你想出的内容?