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