使用机械化/Nokogiri按类获取最接近的前一个同级中的文本值



当前我正在循环遍历表行,并从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即可获得这种结果。

相关内容

  • 没有找到相关文章