Вопрос:

Нокогири возвращает значения в виде строки, а не массива

ruby nokogiri

1893 просмотра

2 ответа

556 Репутация автора

Я запускаю скрипт с использованием 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"]

Есть идеи, почему это не работает?

Автор: Utopia025 Источник Размещён: 02.11.2012 05:27

Ответы (2)


7 плюса

54782 Репутация автора

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)

Автор: tokland Размещён: 02.11.2012 05:39

1 плюс

15764 Репутация автора

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 }
Автор: pje Размещён: 02.11.2012 05:40
Вопросы из категории :
32x32