通过Nokogiri获取可见的文字

问题描述 投票:7回答:3

我想用Nokogiri打开一个网页,并提取用户在浏览器中访问该页面时看到的所有单词并分析单词频率。

使用nokogiri从html文档中获取所有可读单词的最简单方法是什么?理想的代码段将使用一个html页面(例如文件),并给出一个数组,其中包含来自所有可读类型的元素的单个单词的数组。

((无需担心javascript或CSS的隐藏元素,因此也隐藏单词;只需设计用于显示的所有单词就可以了。)

ruby nokogiri
3个回答
13
投票

您想要Nokogiri::XML::Node#inner_text方法:

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.length, words.uniq.sort[0..5]
#=> 872
#=> 406
#=> ["Answer", "Ask", "Badges", "Browse", "DocumentFragment", "Email"]

4
投票

如果您真的想使用Nokogiri进行此操作(否则您可以使用正则表达式剥离标签),那么您应该:

  1. doc = Nokogiri :: HTML(open('url')。read)#open-uri
  2. 使用doc.search('script')之类的东西将所有javascript和样式标签剥离。每个{| el | el.unlink}
  3. doc.text

0
投票

更新:从ruby 2.7开始-有一个新的Enumerable方法-# 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, #=> ... -计算出现次数

错误选择答案:html.at('body')。inner_text-将连接所有节点的所有文本-无空格。例如包含以下内容的文档:

tally

将导致“ thistext”

更好:使用<html><body><p>this</p><p>text</p></body><html>

this answer
© www.soinside.com 2019 - 2024. All rights reserved.