选择“”与ruby中的机械化链接

时间:2013-08-10 08:29:57

标签: ruby scripting rubygems mechanize mechanize-ruby

我在ruby中创建了一个使用mechanize的脚本。它会转到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

1 个答案:

答案 0 :(得分:1)

  

注意屏幕上的所有空格?那是空名   “”链接在pp页面输出上。任何人对我如何能有任何想法   点击一个?

     

page = agent.page.link_with(:text =&gt;'')。click

这条线适合我。我将以下两个html页面放在我的本地apache服务器的htdocs目录(一个可公开访问的目录)中:

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>

然后我启动了我的服务器,这意味着我的浏览器可以使用url访问page1.html:

http://localhost:8080/page1.html

然后我运行了ruby程序:

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页面输出与输出相同,我成功地点击了没有文本的链接 - 输出页面2证明了这一点。

该代码的唯一问题是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。