使用Mechanize / Nokogiri通过类获取最接近的前一个兄弟中的文本值

时间:2015-11-30 16:31:55

标签: ruby nokogiri mechanize

目前我正在循环表行并从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等。

当兄弟姐妹的数量未知时,如何获得某个班级的第一个兄弟姐妹?

1 个答案:

答案 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即可获得此类结果。