Nokogiri将值作为字符串返回,而不是数组

时间:2012-11-02 17:27:48

标签: ruby nokogiri

我正在使用Nokogiri运行一个返回多个值的脚本。我的印象(并且由多个来源保证)结果应该是数组的形式。相反,我得到一个丑陋的字符串。这是代码

require 'nokogiri'
require 'open-uri'
require 'spreadsheet'

profile_page_scraper = Nokogiri::HTML(open('http://www.crunchbase.com/company/facebook'))       
puts profile_page_scraper.css('div.col1_content td.td_left').text

返回此内容:

PublicDateRaisedPost IPO ValuationWebsiteBlogTwitterCategoryEmployeesFoundedDescription

我知道我可以使用map来快速解决这个问题,但我很困惑为什么这不会返回数组。从理论上讲,它应该返回这样的东西:

["Public", "Date", "Raised" ... "Description"]

为什么这不起作用的任何想法?

2 个答案:

答案 0 :(得分:7)

NodeSet#text总是返回一个字符串(否则它可能会被称为NodeSet#texts)。 Nokogiri文档不是那么好,如果有疑问,请查看源代码:

  # lib/nokogiri/xml/node_set.rb
  def inner_text
    collect{|j| j.inner_text}.join('')
  end
  alias :text :inner_text

获取一系列文本:nodes.map(&:text)

答案 1 :(得分:1)

css方法返回Nokogiri::XML::NodeSet的实例,其中包含Enumerable

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.crunchbase.com/company/facebook'))  
nodes = doc.css('div.col1_content td.td_left')
nodes.class.ancestors
# => [Nokogiri::XML::NodeSet, Enumerable, Object, Kernel, BasicObject]

因此,您可以将所有标准迭代器与此结果集中每个元素的content属性结合使用。例如:

nodes.each { |n| puts n.content }