目前我正在看一下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')
但这不起作用。
答案 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.links
,ll.attributes
为Nokogiri::XML::Element
,ll.attributes.attributes
为Hash
,其中包含链接上的属性,因此,在将值与'l'进行比较之前,需要ll.attributes.attributes
得到实际的类并且需要进行nil检查
在条件中使用:id
查找表单的问题在于它与Ruby的Object#id
方法冲突,以返回Ruby对象的内部标识。我不确定这方面的工作是什么。您可以通过其他属性(例如,其操作)选择表单没有问题。
答案 2 :(得分:0)
我相信您正在寻找的选择器是:
:dom_id
例如在你的情况下:
my_form = page.form_with(:dom_id => 'myformid')