2017-09-21 33 views
0

我试图从google获取结果并将它们保存到文件中。但结果正在重复。 当我将它们保存到文件时,只有最后一个链接被打印到文件。抓取时YouTube的重复结果

require 'rubygems' 
require 'mechanize' 

agent = Mechanize.new 
page = agent.get('http://www.google.com/videohp') 

google_form = page.form('f') 
google_form.q = 'ruby' 

page = agent.submit(google_form, google_form.buttons.first) 
linky = page.links 
for link in linky do 
    if link.href.to_s =~/url.q/ 
    str=link.href.to_s 
    strList=str.split(%r{=|&}) 
    $url=strList[1].gsub("h%3Fv%3D", "h?v=") 
    $heading = link.text 
    $res = $url 
    if ($url.to_s.include? "webcache") 
     next 
    elsif ($url.to_s.include? "channel") 
     next 
    end 
    puts $res 
    end 
end 

for link in linky do 
    File.open("aaa.htm", 'w') { |file| file.write($res) } 
end 
+1

'file.write($ res)'总是将'$ res'的值写入文件。你可能想用'link'做一些事情(或者把写作移到第一个循环中)。另外,你应该使用'each'而不是'for'并且避免使用全局变量(那些以'$'开头的变量)。 – Stefan

+0

谢谢@Stefan我会纠正他们。 –

回答

0

这真的是两个问题,很明显你刚刚开始使用Ruby,你会在实践中变得更好,但它有助于继续阅读语言的基础知识,这看起来有点像写在PHP中红宝石。

首先,链接很可能会多次出现,因为它们在页面中不止一次出现。你没有做任何事情来捕捉它。

其次,你有一个全局变量(这些往往会导致问题,只有当你找不到替代品时才会真正使用它),但是每当你这样做,就会覆盖你之前有过。所以,每当你去$res = $url你覆盖$res什么是最后$url你得到。

如果您创建了一个数组而不是具有单个值$res(它也可以是本地变量),那么您可以使用myArray.push(url)向其添加每个新的url。

当您获得阵列中的所有URL后,可以使用myArray.uniq在写入文件之前清除重复项。

0

看起来你并不了解Ruby。

请不要使用全局变量,除非你真的需要它们 - 在这种情况下,你不这样做,它不是PHP。简单的分配就足够了。 :)

要重复收集,请使用专用的#each方法。在你的情况下,你想过滤链接的集合,并留下那些符合你的需求valid_links = links.filter {| link | ...}。

如果它们不符合您的需求,则返回false,如果它们与您的语句匹配则返回true。

File.open,你需要通过File.open块内的集合(你将有valid_links通过)。

0
require 'rubygems' 
require 'mechanize' 

agent = Mechanize.new 
page = agent.get('http://www.google.com/videohp') 

google_form = page.form('f') 
google_form.q = 'ruby' 

page = agent.submit(google_form, google_form.buttons.first) 
linky = page.links 
for link in linky do 
    if link.href.to_s =~/url.q/ 
    str=link.href.to_s 
    strList=str.split(%r{=|&}) 
    $url=strList[1].gsub("h%3Fv%3D", "h?v=") 
    $heading = link.text 
    $res = $url 
    if ($url.to_s.include? "webcache") 
     next 
    elsif ($url.to_s.include? "channel") 
     next 
    end 
    puts $res 
    File.open("aaa.htm", 'w') { |file| file.write($res) } 
    end 
end