计算CSS类的出现次数

时间:2011-12-01 12:26:21

标签: html css ruby nokogiri

我有一个Ruby程序,它将HTML文档作为输入。这个HTML文档的结构是未知的,可以是任何东西。

此外,还保证文档使用CSS进行格式化。

输出必须是散列,其中每个键都是文档中使用的CSS类,值是CSS类出现在文档正文中的次数。

1 个答案:

答案 0 :(得分:3)

require 'open-uri'
require 'nokogiri'

doc = Nokogiri.HTML(open('http://stackoverflow.com'))
classes = doc.xpath('//@class').map{ |attr| attr.value.split(/\s+/) }.flatten
counts = Hash[
  classes.group_by(&:to_s).map{ |n,ary| [n,ary.count] }.sort_by{ |n,i| [-i,n] }
]

require 'pp'
pp counts
#=>{"post-tag"=>320,
#=> "mini-counts"=>270,
#=> "cp"=>90,
#=> "narrow"=>90,
#=> "question-hyperlink"=>90,
#=> ...etc...

描述:

  1. 使用xpath查找所有class="..."属性,例如class="a b"class="c"class="b"
  2. 关于空格的
  3. split,例如class="a b"["a","b"]
  4. flatten到一个列表中,例如[["a","b"],["c"],["b"]]["a","b","c","b"]
  5. group_by从字符串哈希到点击,例如⇒{"a"=>["a"],"b"=>["b","b"],"c"=>["c"]}
  6. map将姓名与length配对,例如⇒[["a",1],["b",2],["c",1]]
  7. 为了好玩,sort_by次出现下降,例如⇒[["b",2],["a",1],["c",1]]
  8. Hash.[]再次变为哈希,例如⇒{"b"=>2,"a"=>1",c"=>1}
  9. 或者(不是功能风格,更直接)在步骤3之后循环并向哈希添加计数。对于奖励积分,请使用默认的“0”值初始化哈希:

    counts = Hash.new(0)
    classes.each{ |name| counts[name] += 1 }