我正在尝试从Google获取结果并将其保存到文件中。但结果却在重复。 此外,当我将它们保存到文件时,只有最后一个链接打印到文件。
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
答案 0 :(得分:0)
看起来你真的不懂Ruby。
请不要使用全局变量,除非你真的需要它们 - 在这种情况下你不是,它不是PHP。简单的分配就足够了。 :)
要遍历集合,请使用专用的#each
方法。在您的情况下,您希望过滤链接集合并留下符合您需求的链接valid_links = links.filter {| link | ......}。
如果他们不符合您的需求,则返回false,如果他们符合您的陈述,则返回true。
在File.open
中,您需要浏览File.open
块内的集合(您将拥有valid_links)。
答案 1 :(得分:0)
这真的有两个问题,很明显你刚刚开始使用Ruby-你会在练习中变得更好但是这将有助于继续阅读语言的基础知识,这看起来像有点像用Ruby编写的PHP。
首先,链接很可能会多次显示,因为它们在页面中不止一次出现。你没有做任何事情来抓住它。
其次你有一个全局变量(这些往往会导致问题,只有在你找不到替代方案时才能使用它),你将每个URL放入其中,但每次这样做时,你都会覆盖什么你以前有过。因此,每次你去$res = $url
时,你都会覆盖$res
中最后$url
所有的内容。
如果您创建了一个数组而不是单个值$res
(它也可以是一个局部变量),那么您可以使用myArray.push(url)
向其添加每个新URL。
如果您拥有阵列中的所有网址,则可以使用myArray.uniq删除重复项,然后再将其写入文件。
答案 2 :(得分: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