Есть несколько причин этой проблемы. Во-первых, когда вы используете return внутри каждого цикла, вы фактически разрываете его, поэтому он повторяется только один раз, а не 25 раз.
Во-вторых, вы можете не заметить, что он запускается только один раз, потому что когда вы используете // имя в xpath, он возвращает все имена.
Возможно, вы могли бы сделать что-то вроде этого:
# Returns top 25 since the url includes limit=25
itunes_top_25 = Nokogiri.XML(open("http://itunes.apple.com/us/rss/toppodcasts/limit=25/xml"))
names_and_urls = itunes_top_25.xpath('//feed/entry').map do |entry|
name = entry.xpath("./name").text
url = entry.xpath("./link/@href").text
category = entry.xpath("./category/@term").text
hosts = entry.xpath("./artist").text
summary = entry.xpath("./summary").text
artwork = entry.xpath("./image[@height='170']").text
[name, url]
end
Я изменил // имя на ./name, чтобы оно возвращалось только для текущего узла. Я также изменил каждый на map, чтобы он назначал переменную массиву со всеми значениями, возвращаемыми блоком. И я удалил звонок, чтобы вернуться, так как это не нужно.
Таким образом, это приведет к массиву массивов, содержащих имена и URL-адреса