将HTML元素添加到数组中

时间:2014-12-02 17:44:33

标签: ruby nokogiri elements

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

2 个答案:

答案 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