ruby - 选择 ""与 ruby 中的 Mechanize 链接

标签 ruby scripting rubygems mechanize mechanize-ruby

我用 ruby​​ 编写了一个使用 mechanize 的脚本。它会转到 google.com,让你登录,然后用图片搜索猫。接下来,我想从页面中选择一个结果链接,然后保存图像。

我的问题是所有结果的链接都显示为空字符串,所以我不确定如何指定和单击它们。

这里是 pp page 的输出,所以你可以看到我正在谈论的链接。请注意,第一个链接是建议的链接,我可以点击这些链接,因为它们的标题是“过去 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

最佳答案

Notice all the whitespace on the screen? That is where the empty name "" links are on the pp page output. Anyone have any ideas on how i can click one?

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。

关于ruby - 选择 ""与 ruby 中的 Mechanize 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18160106/

相关文章:

Ruby 客户端-服务器应用程序结构

ruby - Ruby 中的 STL 支持

ruby-on-rails - Ruby Gem (EventMachine) 无法使用 Bundler GEM 安装

ruby-on-rails - 我可以阻止 Rails 将实例变量从 Controller 传递给 View 吗?

Ruby 正则表达式 - gsub 仅捕获组

mysql - 如何用mysqldump写存储过程来分隔文件?

bash 脚本 - 如何将逗号分隔列表作为函数的输入参数进行处理

c# - 使用正则表达式匹配两个特定单词之间的所有内容

ruby-on-rails - Twitter Bootstrap Typeahead 文本字段名称属性与自动完成混淆

linux - 如何使用 bash 脚本或 awk 打印 csv 文件中的单个单元格