2010-02-02 23 views
4

目前我正在看机械化。 我对Ruby很新,所以请耐心等待。红宝石 - 机械化:按类名和其他问题选择链接

我写了一个小测试脚本:

require 'rubygems' 
require 'mechanize' 

agent = WWW::Mechanize.new 

page = agent.get('http://www.google.de') 
pp page.title 
google_form = page.form_with(:name => 'f') 
google_form.q = 'test' 
page = agent.submit(google_form) 
pp page.title 

page_links = Array.new 
page.links.each do |ll| 
    page_links << ll 
end 
puts page_links.size 

这工作。但是page_links不仅包含搜索结果。它还包括谷歌链接,如登录,图片,... 结果链接拥有styleclass“1”。是否可以只选择类== 1的链接?我如何实现这一目标?

是否可以修改“agentalias”?如果我拥有一个网站,包括谷歌分析或什么的,我会看到我的网站上机械化的浏览器客户端?

我可以通过他们的ID而不是他们的名字选择元素吗?我试图用

my_form = page.form_with(:id => 'myformid') 

但是,这是行不通的。

回答

2

你可以通过改变你的代码如下打造的不仅仅是搜索结果链接的列表:

page.links.each do |ll| 
    cls = ll.attributes.attributes['class'] 
    page_links << ll if cls && cls.value == 'l' 
end 

对于每一个元素llpage.linksll.attributesNokogiri::XML::Elementll.attributes.attributes是包含在属性的Hash链接,因此需要ll.attributes.attributes得到在实际的类和无零检查的需要之前比较值'''

在暴击中使用:id的问题eria找到一个表单就是它与Ruby的Object#id方法冲突,以返回一个Ruby对象的内部id。我不确定这是什么工作。你可以通过其他属性(例如它的动作)来选择表单。没有问题。

4

在这种情况下,就像我使用Nokogiri DOM搜索一样。 这里是你的代码一点点改写:

require 'rubygems' 
require 'mechanize' 

agent = Mechanize.new 

page = agent.get('http://www.google.de') 
pp page.title 
google_form = page.form_with(:name => 'f') 
google_form.q = 'test' 
page = agent.submit(google_form) 
pp page.title 

page_links = Array.new 
#maybe you better use 'h3.r > a.l' here 
page.parser.css("a.l").each do |ll| 
#page.parser here is Nokogiri::HTML::Document 
    page_links << ll 
    puts ll.text + "=>" + ll["href"] 
end 
puts page_links.size 

也许这篇文章是一个良好的开端: getting-started-with-nokogiri 通过文章还应对谷歌搜索的方式样本;)

0

我相信您正在寻找的选择器是:
:dom_id
eg在你的情况下:
my_form = page.form_with(:dom_id => 'myformid')