2017-09-21 70 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