2016-05-14 26 views
0

我想用Nokogiri來捕捉http://www.ign.com/games/reviews,我想實例化與頁面上每個遊戲評論對應的新評論對象。當然,我還想從每個評論中獲取每個數字分數,並將該分數值作爲類屬性分配給我的評論對象。Nokogiri和隔離從Nokogiri節點的數組中選擇的元素

問題是,我能做的最好的是返回整個字符串的分數,而不是由每個分數組成的列表。

class VideoGameReviews::Review 
    attr_accessor :name, :score, :url 

    def self.scrape_titles 
    @doc = Nokogiri::HTML(open("http://www.ign.com/games/reviews?")) 

    @doc.search("#item-list div.itemList div.itemList-item").each do |review| 
     new_review = VideoGameReviews::Review.new 

     new_review.score = review.search("span.scoreBox-score").text 
     => "99996.37.17.17.17778.58.58.586.36.47.187.57.88.95.587.6" #Not what I want 
    end 
    end 

end 

有關如何提取分數列表的任何建議,每個分數與其他分數獨立並獨一無二?也許使用更具體的CSS選擇器?

回答

0

您正在使用nokogiri,但需要修改您的邏輯以正確存儲分數。例如,我們可以得到一個單獨的遊戲分數相當容易:

new_review.score = fourth_item.search("span.scoreBox-score").text 
=> "6.3" 

不得不做在一個單一的方法都相反的,你可以根據需要通過破壞你的代碼轉換成更小的方法和cacheing值開始。我也會更改這個班級名稱,因爲您的Review班級既代表Review項目也代替了(違反單一職責原則)。也許像下面的東西會更好?

require ‘nokogiri’ 

class VideoGameReviews::ReviewScraper 

    def reviews 
    @reviews ||= Nokogiri::HTML(open("http://www.ign.com/games/reviews?")) 
    end 

    def review_items 
    @review_items ||= reviews.search("#item-list div.itemList div.itemList-item") 
    end 

    def store_reviews 
    review_items.each do |review| 
     new_review = VideoGameReviews::Review.new #Review class still used to save review 
     new_review.score = review.search("span.scoreBox-score").text 
     #get other data 
     new_review.save! #or however you plan on persisting the data 
    end 
    end 

end 

問題是:你將如何保存評論(在本地內存,在數據庫等)?對於快速的,ActiveRecord是非常簡單的(你可以獨立使用Rails)。

請注意:Ruby中的每個方法將始終返回其調用的原始集合。例如以下將返回[1,2]

[1,2].each do |n| 
    n * 4 
end