Выбор ссылок с помощью mechanize в ruby

Я сделал скрипт на рубине, который использует механизацию. Он переходит на google.com, регистрирует вас и выполняет поиск изображений для кошек. Далее я хочу выбрать одну из ссылок результатов со страницы, а затем сохранить изображение.

Моя проблема в том, что ссылки для всех результатов отображаются как пустые строки, поэтому я не уверен, как указать и щелкнуть их.

вот вывод страницы pp, чтобы вы могли видеть ссылки, о которых я говорю. Обратите внимание, что первая ссылка — это рекомендуемые ссылки, я могу нажать на них, потому что у них есть заголовок «Последние 24 часа», но вторая ссылка — это фактический результат поиска, на который я не могу нажать.

#<Mechanize::Page::Link
  "Past 24 hours"
  "/search?q=cats&hl=en&gbv=1&ie=UTF8&tbm=isch&source=lnt&tbs=qdr:d&sa=X&ei=T8kDUu7aB4f8iwKZx4HoBg&ved=0CCQQpwUoAQ">

#<Mechanize::Page::Link
""
"http://www.google.com/imgres?imgurl=http://jasonlefkowitz.net/wp-content/uploads/2013/07/Cute-Cats-cats-33440930-1280-800.jpg&imgrefurl=http://jasonlefkowitz.net/2013/07/slideshow-20-cats-that-suck-at-reducing-tensions-in-the-israeli-palestinian-conflict/&usg=__1YEuvKE4A9r6IIRkcz9Pu6ahN8Q=&h=800&w=1280&sz=433&hl=en&start=1&sig2=ekqjELPNQsK-QQ2r-4TeeQ&zoom=1&tbnid=Xz9P1WD4o4TSlM:&tbnh=94&tbnw=150&ei=b8sDUq36Ge3figLCzoBY&itbs=1&sa=X&ved=0CCwQrQMwAA">

Теперь вот фрагмент вывода:

page.links.each do |link|
puts link.text.
end

Который будет отображать ссылки на странице.

More
Large
Face
Photo
Clip art
Line drawing
Animated
Past 24 hours
Past week
Reset tools



















funny cats
cats and kittens
cats musical
cute cats
lots of cats
cats with guns
2
3
4
5
6
7
8
9
10
Next

Заметили все пробелы на экране? Вот где пустые ссылки имени "" находятся на выходе страницы pp. У кого-нибудь есть идеи о том, как я могу нажать один?

Вот код скрипта.

require 'mechanize'
agent = Mechanize.new
page = agent.get('https://google.com')
page = agent.page.link_with(:text => 'Sign in').click
# pp page
sign_in = page.form()       ##leave empty = nil
sign_in.Email = '10halec'
sign_in.Passwd = 'password'
page = agent.submit(sign_in)

page = agent.page.link_with(:text => 'Images').click
search = page.form('f')
search.q = 'cats'
page = agent.submit(search)

# pp page

# agent.page.image_with(:src => /imgres?/).fetch.save
page = agent.page.link_with(:text => '').click
# pp page

# page.links.each do |link|
#   puts link.text
# end
pp page

def save filename = nil
  filename = find_free_name filename
  save! filename
end

person Cody H    schedule 10.08.2013    source источник
comment
Разместите соответствующий HTML-код на странице, с которой у вас возникли проблемы.   -  person 7stud    schedule 10.08.2013


Ответы (1)


Заметили все пробелы на экране? Вот где пустые ссылки имени находятся на выходе страницы pp. У кого-нибудь есть идеи о том, как я могу нажать один?

страница = агент.страница.ссылка_с(:текст =› '').нажмите

Эта линия работает для меня. Я поместил обе следующие html-страницы в каталог htdocs моего локального сервера Apache (общедоступный каталог):

страница1.html:

<!DOCTYPE html>
<html>
  <head><title>Test</title></head>
  <body>
    <div><a href="/somesite.com/cat1.jpg">cat1</a></div>
    <div><a href="/page2.html"></a></div>
    <div><a href="/somesite.com/cat3.jpg"></a></div>
  </body>
</html>

страница2.html:

<!DOCTYPE html>
<html>
  <head><title>Page2</title></head>
  <body>
    <div>hello</div>
  </body>
</html>

Затем я запустил свой сервер, что означало, что страница page1.html была доступна в моем браузере по URL-адресу:

http://localhost:8080/page1.html

Затем я запустил рубиновую программу:

require 'mechanize'

agent = Mechanize.new
agent.get('http://localhost:8080/page1.html')
pp agent.page

page = agent.page.link_with(:text => '').click
puts page.title 

... и вывод был:

#<Mechanize::Page
 {url #<URI::HTTP:0x00000100c8dc18 URL:http://localhost:8080/page1.html>}
 {meta_refresh}
 {title "Test"}
 {iframes}
 {frames}
 {links
  #<Mechanize::Page::Link "cat1" "/somesite.com/cat1.jpg">
  #<Mechanize::Page::Link "" "/page2.html">
  #<Mechanize::Page::Link "" "/somesite.com/cat3.jpg">}
 {forms}>

Page2

Вывод страницы pp выглядит так же, как ваш вывод, и мне удалось щелкнуть ссылку без текста, о чем свидетельствует вывод Page2.

Единственная проблема с этим кодом заключается в том, что link_with() возвращает только первое совпадение. Если я использую links_with(), я получаю все совпадающие ссылки:

require 'mechanize'

agent = Mechanize.new
agent.get('http://localhost:8080/page1.html')

links = agent.page.links_with(:text => '')
p links

--output:--
[#<Mechanize::Page::Link "" "/page2.html">
, #<Mechanize::Page::Link "" "/somesite.com/cat3.jpg">
]

Я хотел бы увидеть фактический html ссылок, с которыми у вас возникли проблемы.

person 7stud    schedule 10.08.2013
comment
спасибо, это действительно помогло. Простая ошибка с моей стороны, мне нужно было links_with, чтобы я мог определить проиндексированную позицию для щелчка. - person Cody H; 10.08.2013