gpt4 book ai didi

css - Nokogiri 并从充满 Nokogiri 节点的数组中隔离选择元素

转载 作者:行者123 更新时间:2023-11-28 05:53:02 28 4
gpt4 key购买 nike

我正在尝试抓取 http://www.ign.com/games/reviews使用 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 选择器?

最佳答案

您正在正确使用 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

关于css - Nokogiri 并从充满 Nokogiri 节点的数组中隔离选择元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221679/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com