加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 通过Nokogiri获取可查看的文字

发布时间:2020-12-16 23:34:09 所属栏目:百科 来源:网络整理
导读:我想打开一个包含Nokogiri的网页,并提取用户在浏览器中访问该页面时所看到的所有单词并分析单词频率. 使用nokogiri从html文档中获取所有可读单词的最简单方法是什么?理想的代码片段将采用html页面(比如文件),并提供一系列单个单词,这些单词来自可读的所有类
我想打开一个包含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,#=>  ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读