当前我正在循环遍历表行,并从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"=>9000、"Sub-TType"=>3000等
当兄弟姐妹的数量未知时,如何获得某个类的前一个兄弟姐妹?
您可以用不同的方式看待这一点,遍历所有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
即可获得这种结果。