我有一个Ruby程序,它将HTML文档作为输入。这个HTML文档的结构是未知的,可以是任何东西。
此外,还保证文档使用CSS进行格式化。
输出必须是散列,其中每个键都是文档中使用的CSS类,值是CSS类出现在文档正文中的次数。
答案 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...
描述:
xpath
查找所有class="..."
属性,例如class="a b"
,class="c"
,class="b"
split
,例如class="a b"
⇒["a","b"]
flatten
到一个列表中,例如[["a","b"],["c"],["b"]]
⇒["a","b","c","b"]
group_by
从字符串哈希到点击,例如⇒{"a"=>["a"],"b"=>["b","b"],"c"=>["c"]}
map
将姓名与length
配对,例如⇒[["a",1],["b",2],["c",1]]
sort_by
次出现下降,例如⇒[["b",2],["a",1],["c",1]]
Hash.[]
再次变为哈希,例如⇒{"b"=>2,"a"=>1",c"=>1}
或者(不是功能风格,更直接)在步骤3之后循环并向哈希添加计数。对于奖励积分,请使用默认的“0”值初始化哈希:
counts = Hash.new(0)
classes.each{ |name| counts[name] += 1 }