Ruby - Mechanize: выбор ссылки по имени класса и другие вопросы - PullRequest
4 голосов
/ 02 февраля 2010

В данный момент я смотрю на 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 включает в себя не только результаты поиска.Он также включает в себя ссылки Google, такие как Логин, Картинки, ... В результате ссылки имеют класс стилей "1".Можно ли выбрать только ссылки с классом == 1?Как мне этого добиться?

Можно ли изменить "agentalias"?Если у меня есть веб-сайт, включая Google Analytics или что-то еще, какой клиент-браузер я увижу в механизме на моем сайте?

Могу ли я выбирать элементы по их идентификатору вместо их имени?Я пытался использовать

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

Но это не работает.

Ответы [ 3 ]

4 голосов
/ 14 марта 2011

в таких случаях, как ваш, я использую Nokogiri DOM search. Вот ваш код немного переписан:

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

Вероятно, эта статья - хорошее место для начала: получение стартер-с-nokogiri Кстати, примеры в статье также касаются поиска Google;)

2 голосов
/ 02 февраля 2010

Вы можете создать список только ссылок на результаты поиска, изменив свой код следующим образом:

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, содержащий атрибуты ссылки, следовательно, для ll.attributes.attributes необходимо получить фактическую класс и необходимость проверки на ноль перед сравнением значения с 'l'

Проблема с использованием :id в критериях для поиска формы заключается в том, что она конфликтует с методом Object#id Ruby для возврата внутреннего идентификатора объекта Ruby. Я не уверен, что обойти это. У вас не возникнет проблем с выбором формы по другому атрибуту (например, по его действию).

0 голосов
/ 19 мая 2013

Я считаю, что искомый селектор:
:dom_id
например в вашем случае:
my_form = page.form_with(:dom_id => 'myformid')

...