Ruby每个循环都不是';每个元件的t形表面处理

Ruby每个循环都不是';每个元件的t形表面处理,ruby,loops,iteration,Ruby,Loops,Iteration,以下代码: # fetch the top 300 podcasts from itunes itunes_top_300 = Nokogiri.HTML(open("http://itunes.apple.com/us/rss/toppodcasts/limit=25/xml")) # parse the returned xml with nokogiri itunes_top_300.xpath('//feed/entry').each do |entry| name = entry

以下代码:

# fetch the top 300 podcasts from itunes
itunes_top_300 = Nokogiri.HTML(open("http://itunes.apple.com/us/rss/toppodcasts/limit=25/xml"))

# parse the returned xml with nokogiri
itunes_top_300.xpath('//feed/entry').each 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
  return name + url
end
正在视图中输出:

iTunes商店美国生活NPR:等等。。。别告诉我!你应该知道的PodcastStuff你应该知道Freakonomics电台新鲜空气PodcastNPR:汽车谈话PodcastWNYC的放射学可辨别的猪前珍珠动画飞蛾PodcastAPM:来自沃贝甘纳里湖的草原之家伙伴新闻波特1-5年关于持家人的PodcastAce-持家人特写:实施抢劫-持家人的制作NPR:《星球金钱》播客你在历史课上错过的东西Dave Ramsey展示书评全球新闻吸血鬼很烂的剪辑NPR:科学星期五播客其他人崩溃并回到工作中NPR:所有被认为是播客的歌曲NPR:小型桌面音乐会Podcasthttp://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?id=38&popId=3http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/toppodcasts/limit=25/xml?cc=ushttp://itunes.apple.com/us/podcast/this-美国人寿/id201671138?uo=2&uo=2http://itunes.apple.com/us/podcast/npr-wait-wait-dont-tell-me/id121493804?uo=2&uo=2http://itunes.apple、 com/us/podcast/stuff your should know/id278981407?uo=2&uo=2http://itunes.apple.com/us/podcast/freakonomics-radio/id354668519?uo=2&uo=2http://itunes.apple.com/us/podcast/npr-新鲜空气播客/id214089682?uo=2&uo=2http://itunes.apple.com/us/podcast/npr-car-talk-podcast/id253191823?uo=2&uo=2http://itunes.apple.com/us/podcast/wnycs-radiolab/id152249110?uo=2&uo=2http://itunes.apple.com/us/podcast/despicable-me/id399247154?uo=2&uo=2http://itunes.apple.com/us/podcast/pearls-在安装前/id409382502?uo=2&uo=2http://itunes.apple.com/us/podcast/the-moth-podcast/id275699983?uo=2&uo=2http://itunes.apple.com/us/podcast/apm-a-prairie-home-compartments/id215352157?uo=2&uo=2http://itunes.apple.com/美国/podcast/harry-potter-years-1-5-podcast/id32214752?uo=2&uo=2http://itunes.apple.com/us/podcast/ace-on-the-house/id414294132?uo=2&uo=2http://itunes.apple.com/us/podcast/takers-takers featurette执行/id412910974?uo=2&uo=2http://itunes.apple.com/us/podcast/npr-planet-money-podcast/id290783428?uo=2&uo=2http://itunes.apple.com/us/podcast/stuff-你错过了历史记录/id283605519?uo=2&uo=2http://itunes.apple.com/us/podcast/the-dave-ramsey-show/id77001367?uo=2&uo=2http://itunes.apple.com/us/podcast/book-审查/id120315179?uo=2&uo=2http://itunes.apple.com/us/podcast/global-news/id135067274?uo=2&uo=2http://itunes.apple.com/us/podcast/vampires-吸管夹/id405404825?uo=2和uo=2http://itunes.apple.com/us/podcast/npr科学星期五播客/id73329284?uo=2&uo=2http://itunes.apple.com/us/podcast/other-guys-crash-and-burn/id407622041?uo=2&uo=2http://itunes.apple.com/us/podcast/back-工作/id415535037?uo=2&uo=2http://itunes.apple.com/us/podcast/npr-all-songs-considered-podcast/id79687345?uo=2&uo=2http://itunes.apple.com/us/podcast/npr-tiny-desk音乐会播客/id362115318?uo=2&uo=2

您可以看到,在进入url之前,它会获取所有元素的名称。我希望它在继续下一个元素之前,为每个元素计算名称和url等。我做错了什么


谢谢。

你用你想要的东西声明变量,然后扔掉它,因为你只
返回name+url

相反,请尝试
returnname+url+category+thing1+thing2

更好


return[url,category,thing1,thing2]
通过调用
return
您将在第一次迭代中停止
每个
循环。也许你不想那样。此外,通过在循环中使用xpath
//name
,您可以从文档顶部重新开始,找到整个文档中的每个name元素。因此,当您找到第一个
时,您将返回一个数组,该数组是通过将文档中每个
元素的数组与文档中每个
元素的数组串联而成的

您可能想要这样:

require 'nokogiri'
require 'open-uri'
# fetch the top 300 podcasts from itunes
# Use XML instead of HTML
itunes_top_300 = Nokogiri::XML(open("http://itunes.apple.com/us/rss/toppodcasts/limit=25/xml"))
itunes_top_300.remove_namespaces!

itunes_top_300.xpath('//entry').each do |entry|
  name = entry.xpath("name").text
  url = entry.xpath("link/@href").text
  puts "#{name}: #{url}"
end
#=> This American Life: http://itunes.apple.com/us/podcast/this-american-life/id201671138?uo=2&uo=2
#=> NPR: Wait Wait... Don't Tell Me! Podcast: http://itunes.apple.com/us/podcast/npr-wait-wait-dont-tell-me/id121493804?uo=2&uo=2
#=> Stuff You Should Know: http://itunes.apple.com/us/podcast/stuff-you-should-know/id278981407?uo=2&uo=2
……或许是这样:

# Convert XML entries into an array of hashes
parsed = itunes_top_300.xpath('//entry').map do |entry|
  name = entry.xpath("name").text
  url = entry.xpath("link/@href").text
  { name:name, url:url }
end

require 'pp'
pp parsed[0..3]
#=> [{:name=>"This American Life",
#=>   :url=>"http://itunes.apple.com/us/podcast/this-american-life/id201671138?uo=2&uo=2"},
#=>  {:name=>"NPR: Wait Wait... Don't Tell Me! Podcast",
#=>   :url=>"http://itunes.apple.com/us/podcast/npr-wait-wait-dont-tell-me/id121493804?uo=2&uo=2"},
#=>  {:name=>"Stuff You Should Know",
#=>   :url=>"http://itunes.apple.com/us/podcast/stuff-you-should-know/id278981407?uo=2&uo=2"},
#=>  {:name=>"Freakonomics Radio",
#=>   :url=>"http://itunes.apple.com/us/podcast/freakonomics-radio/id354668519?uo=2&uo=2"}]

有几个因素导致了这个问题。首先,当在每个循环中使用return时,实际上是在破坏它,因此它只迭代一次,而不是25次

其次,您可能没有注意到它只运行一次,因为在xpath中使用//name时,它会返回所有名称

也许你可以这样做:

# 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更改为//name,以便它只返回当前节点。我还将每个都更改为map,以便它将变量分配给一个包含块返回的所有值的数组。因为没有必要,我取消了返回的呼叫


因此,这将产生一个包含名称和url的数组

你希望它对每个名称和url做什么?@Phrogz:我想他想打印类似于“{name}{url}{name}{url}”的内容,而不是“{name}{name}{name}{url}{name}{url}{url}}{Anon-是的,就是这样。听起来你应该发布查看代码。是的,但与问题无关,非常感谢。这是完美的,您的解释很有教育意义。您可以更改您接受的答案,将解析XML显示为XML而不是HTML。