【问题标题】:Nokogiri and isolating select elements from an array full of Nokogiri nodesNokogiri 并从充满 Nokogiri 节点的数组中隔离选择元素
【发布时间】:2016-05-14 23:41:48
【问题描述】:

我正在尝试使用 Nokogiri 抓取 http://www.ign.com/games/reviews,并且我想实例化与页面上每个游戏评论相对应的新评论对象。当然,我还想从每条评论中获取每个数字分数,并将该分数值作为类属性分配给我的评论对象。

问题是,我能做的最好的事情就是返回一个完整的分数字符串,而不是一个包含每个分数的列表。

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 选择器?

【问题讨论】:

    标签: css ruby nokogiri


    【解决方案1】:

    您正在正确使用nokogiri,但需要修改您的逻辑以正确存储分数。例如,我们可以很容易地获得单个游戏的分数:

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

    您可以先将代码分解为更小的方法并根据需要缓存值,而不必在单个方法中完成所有操作。我也会更改此类名称,因为您的 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 中的 :each 方法将始终返回调用它的原始集合。所以例如以下将返回[1,2]

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多