我想打开一个包含Nokogiri的网页,并提取用户在浏览器中访问该页面时所看到的所有单词并分析单词频率.
使用nokogiri从html文档中获取所有可读单词的最简单方法是什么?理想的代码片段将采用html页面(比如文件),并提供一系列单个单词,这些单词来自可读的所有类型的元素.
(无需担心javascript或css隐藏元素,从而隐藏单词;只需设计用于显示的所有单词都可以.)
解决方法
你想要
Nokogiri::XML::Node#inner_text
方法:
require 'nokogiri' require 'open-uri' html = Nokogiri::HTML(open 'http://stackoverflow.com/questions/6129357') # Alternatively html = Nokogiri::HTML(IO.read 'myfile.html') text = html.at('body').inner_text # Pretend that all words we care about contain only a-z,0-9,or underscores words = text.scan(/\w+/) p words.length,words.uniq.length,words.uniq.sort[0..8] #=> 907 #=> 428 #=> ["0","1","100","15px","2","20","2011","220px","24158nokogiri"] # How about words that are only letters? words = text.scan(/[a-z]+/i) p words.length,words.uniq.sort[0..5] #=> 872 #=> 406 #=> ["Answer","Ask","Badges","Browse","DocumentFragment","Email"]
# Find the most frequent words require 'pp' def frequencies(words) Hash[ words.group_by(&:downcase).map{ |word,instances| [word,instances.length] }.sort_by(&:last).reverse ] end pp frequencies(words) #=> {"nokogiri"=>34,#=> "a"=>27,#=> "html"=>18,#=> "function"=>17,#=> "s"=>13,#=> "var"=>13,#=> "b"=>12,#=> "c"=>11,#=> ... # Hrm...let's drop the javascript code out of our words html.css('script').remove words = html.at('body').inner_text.scan(/\w+/) pp frequencies(words) #=> {"nokogiri"=>36,#=> "words"=>18,#=> "html"=>17,#=> "text"=>13,#=> "with"=>12,#=> "a"=>12,#=> "the"=>11,#=> "and"=>11,#=> ...