Ruby - Mechanize:按类名和其他问题选择链接

时间:2010-02-02 09:44:15

标签: ruby mechanize

目前我正在看一下Mechanize。 我是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不仅包括搜索结果。它还包括谷歌链接,如登录,图片,... 结果链接拥有一个样式“1”。是否可以只选择class == 1的链接?我如何实现这一目标?

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

我可以按ID而不是名字选择元素吗?我试着用

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

但这不起作用。

3 个答案:

答案 0 :(得分: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 顺便说一下文章中的样本也处理谷歌搜索;)

答案 1 :(得分:2)

您可以通过更改代码来构建仅包含搜索结果链接的列表,如下所示:

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

对于ll中的每个元素page.linksll.attributesNokogiri::XML::Elementll.attributes.attributesHash,其中包含链接上的属性,因此,在将值与'l'进行比较之前,需要ll.attributes.attributes得到实际的类并且需要进行nil检查

在条件中使用:id查找表单的问题在于它与Ruby的Object#id方法冲突,以返回Ruby对象的内部标识。我不确定这方面的工作是什么。您可以通过其他属性(例如,其操作)选择表单没有问题。

答案 2 :(得分:0)

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