【问题标题】:Nokogiri returning values as a string, not an arrayNokogiri 将值作为字符串返回,而不是数组
【发布时间】:2012-11-02 17:27:48
【问题描述】:

我正在使用返回多个值的 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"]

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

【问题讨论】:

  • 您应该接受以下答案之一。

标签: ruby nokogiri


【解决方案1】:

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)

【讨论】:

  • Nokogiri 的 Node.text documentation 表示“返回此节点的内容”,而 Nodeset.text documentation 表示“获取所有包含的节点对象的内部文本”。第二个将 NodeSet 中包含的所有节点的文本连接成一个字符串。
【解决方案2】:

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 }

【讨论】:

    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2016-09-28
    相关资源
    最近更新 更多