2013-08-10 4 views
2

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

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

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

#<Mechanize::Page::Link 
    "Past 24 hours" 
    "https://stackoverflow.com/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 
+0

Опубликовать соответствующий html на странице, с которой вы столкнулись. – 7stud

ответ

1

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

страница = agent.page.link_with (: текст => '') .click

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

page1.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> 

page2.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 

Выход С. страница выглядит так же, как ваш выход, и я был успешно в состоянии нажать на ссылка, которая не имеет текста, о чем свидетельствует вывод.

Единственная проблема с этим кодом в том, что 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 из ссылок у вас возникли проблемы с.

+0

спасибо, это действительно помогло. Простая ошибка на моем конце, links_with - это то, что мне нужно, поэтому я могу определить индексированную позицию для клика. –

Смежные вопросы