2

我用 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
4

1 回答 1

1

注意到屏幕上的所有空白了吗?这就是 pp 页面输出中空名称“”链接的位置。有人对我如何点击一个有任何想法吗?

page = agent.page.link_with(:text => '').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>

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

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 页面输出看起来与您的输出相同,并且我成功地能够单击没有文本的链接 - 正如输出 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。

于 2013-08-10T10:30:41.967 回答