如何在Ruby中迭代和抓取数据?

时间:2017-05-27 19:40:30

标签: arrays ruby iteration scrape

我对编程很陌生,需要对我的代码提供一些帮助/反馈。 我的目标是抓取我正常工作的数据,然后在编号列表中将该数据显示给我的用户。我只是难以显示这些数据。我没有得到任何错误我的程序完全跳过我的方法。提前感谢您的任何帮助/反馈!

class BestPlaces::Places
  attr_accessor :name, :population, :places
    @@places = []

  def self.list_places
    # puts "this is inside list places"
    self.scrape_places
  end

      def self.scrape_places
        doc = Nokogiri::HTML(open("https://nomadlist.com/best-cities-to-live"))
            places = doc.search("div.text h2.itemName").text
            rank = doc.search("div.rank").text

            places.collect{|e| e.text.strip}
              puts "you are now in title"
              @@places << self.scrape_places
              puts "#{rank}. #{places}"
            end
          end
        end

CLI Page:
class BestPlaces::CLI

  def list_places
    puts "Welcome to the best places on Earth!"
    puts @places = BestPlaces::Places.list_places
  end

  def call
    list_places
    menu
    goodbye
  end
end

1 个答案:

答案 0 :(得分:0)

在此代码中可以解决一些问题,但让我们首先看到重做:

require 'nokogiri'
require 'open-uri'

module BestPlaces

  class Places
    attr_accessor :name, :population, :places

    def initialize
      @places = []
    end

    def scrape_places
      doc = Nokogiri::HTML(open("https://nomadlist.com/best-cities-to-live"))
      places = doc.search("div.text h2.itemName")
      ranks = doc.search("div.rank")
      places.each{|e| @places << e.text.strip}
      puts "you are now in title"
      @places.each do |place|
        i = @places.index(place)
        puts "#{ranks[i].text}. #{place}"
      end
   end

 end

 class CLI

   def list_places
     puts "Welcome to the best places on Earth!"
     BestPlaces::Places.scrape_places
   end

   def call
     list_places
     menu
     goodbye
   end

 end

end

你有一个看起来不完整的模块/类设置。人们可以这样称呼上述内容:

bp = BestPlaces::Places.new
bp.scrape_places

@@ places变量是不必要的,我们可以使用@places来保存需要在Places类中访问的值。此外,nokogiri在搜索结果上使用.text方法时返回一个字符串对象,这意味着您不能像数组一样迭代它们。我希望这会有所帮助。