目前我正在循环表行并从td获取值,将它们放入由兄弟td中的值标识的排序哈希中:
Ruby代码段
@counts = Hash.new
agent.page.search('.child').each do |child|
@counts[child.css('td')[0].text.strip!] = child.css('td')[1].text.gsub(/,/,'').to_i
end
puts @counts.sort_by{|k,v| v}.reverse.to_h
HTML结构
<tr class="parent">
<td class="info">Type</td>
<td>12,000</td>
</tr>
<tr class="child">
<td class="info">Sub Type</td>
<td>9,000</td>
</tr>
<tr class="child">
<td class="info">Sub Type</td>
<td>3,000</td>
</tr>
<tr class="parent">
<td class="info">Type</td>
<td>11,000</td>
</tr>
<tr class="child">
<td class="info">Sub Type</td>
<td>11,000</td>
</tr>
现在我想通过将哈希键与属于父tr的td中的文本值连接来更改哈希键。所以在上面的HTML结构中,而不是“Sub Type”=&gt; 9000,“子类型”=&gt; 3000等我想得到“Type Sub Type”=&gt; 9000,“类型子类型”=&gt; 3000等。
当兄弟姐妹的数量未知时,如何获得某个班级的第一个兄弟姐妹?
答案 0 :(得分:2)
您可以以不同的方式查看,循环遍历所有tr
元素(父和子),保留最后找到的父类型,然后在到达孩子时连接最后一个父类型。
@counts = Hash.new
parent = nil
agent.page.search('.parent, .child').each do |node|
type = node.css('td')[0].text.strip
value = node.css('td')[1].text.gsub(/,/, '').to_i
if node['class'].include? 'parent'
parent = type
else
@counts["#{parent} #{type}"] = value
end
end
puts @counts.sort_by{|k,v| v}.reverse.to_h
此外,哈希本质上是一种未排序的数据结构。如果你想保留订单,那么你最好的选择就是一系列元组。换句话说,[['Type Sub Type', 12000], ['Type Sub Type', 11000], ..., ['Type Sub Type', 3000]]
。只需删除最后一行末尾的.t_h
即可获得此类结果。