我正在使用Ruby,Mechanize和Nokogiri编写脚本来从网页上的iframe元素中删除源属性,如果有多个,请将它们存储在数组中供以后使用。 / p>
所以我有以下代码可行,但我的问题是;有更优雅的方式实现这一目标吗?比方说iframe.<some_method_like_length>
而不是使用i
计数器?
i = 0
doc.search("//span/iframe").each do |iframe|
$ifrmsrc[i] = iframe.attribute("src")
i += 1
end
i = 0
#LATER USE :)
$ifrmsrc.length.times do |g|
puts $ifrmsrc.at(g)
end
答案 0 :(得分:1)
不确定。使用<<
运算符将项添加到数组的末尾。
ifrmsrc = []
doc.search("//span/iframe").each do |iframe|
ifrmsrc << iframe.attribute("src")
end
...或者,更为Rubyish,使用Enumerable#map
,它为Enumerable中的每个项执行给定的块,并返回一个包含结果的新数组。
ifrmsrc = doc.search("//span/iframe").map {|iframe| iframe["src"] }
(如果ifrmsrc
已经存在并且已经包含您想要的数据,请使用+=
代替=
,因为=
会覆盖它。但是,从您的代码中我猜这是将项目添加到数组中的唯一位置,因此无需提前定义它。)
P.S。 Don't use global variables(即以$
开头的变量)。这只是一种不好的做法。
答案 1 :(得分:0)
我个人更喜欢XPath:
ifrmsrc = doc.xpath("//span/iframe/@src").map(&:value)
之后,您不需要索引来迭代值:
ifrmsrc.each{ |src| puts src }
或者,如果你做需要索引,原因如下:
ifrmsrc.each.with_index{ |src,i| puts "Source ##{i} is #{src}" }
但是,如果你只想要这些值,每行一个:
puts ifrmsrc