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

是否可以修改“代理别名”?如果我拥有一个网站,包括谷歌分析或其他东西,我会在 ga 中看到什么浏览器客户端与我的网站上的 mechanize 一起使用?

我可以通过 ID 而不是名称来选择元素吗?我试着用

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

但这不起作用。

4

3 回答 3

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 顺便说一下,文章中的示例也涉及 Google 搜索;)

于 2011-03-14T18:29:53.933 回答
2

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

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

对于 中的每个元素llpage.linksll.attributesaNokogiri::XML::Element并且ll.attributes.attributes是 aHash包含链接上的属性,因此需要ll.attributes.attributes获取实际类并且需要在将值与“l”进行比较之前进行 nil 检查

使用:idin the criteria 查找表单的问题在于它与 RubyObject#id用于返回 Ruby 对象的内部 id 的方法发生冲突。我不确定解决这个问题的方法是什么。您可以通过其他属性(例如其操作)选择表单。

于 2010-02-02T18:21:53.280 回答
0

我相信您正在寻找的选择器是:例如在您的情况下:
:dom_id

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

于 2013-05-19T14:34:29.070 回答