如何点击Nokogori或Mechanize的特定链接?

时间:2017-11-12 20:11:45

标签: ruby nokogiri bots mechanize open-uri

我知道如何使用Nokogiri找到元素。我知道如何使用Mechanize单击链接。但我无法弄清楚如何找到特定链接并单击它。这似乎应该很容易,但由于某些原因我无法找到解决方案。

假设我只是想点击Google搜索的第一个结果。我不能只点击第一个使用Mechanize的链接,因为Google页面包含许多其他链接,例如“设置”。搜索结果链接本身似乎没有类名,但它们被<h3 class="r"></h3>包围。

我可以使用Nokogiri跟踪链接的href值,如下所示:

document = open("https://www.google.com/search?q=stackoverflow")
parsed_content = Nokogiri::HTML(document.read)
href = parsed_content.css('.r').children.first['href']
new_document = open(href)
# href is equal to "/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;url=https%3A%2F%2Fstackoverflow.com%2F"

但它不是直接的网址,并且转到该网址会出错。 data-href值是一个直接网址,但我无法弄清楚如何获得该值 - 做同样的事情,除了...first['data-href']返回nil。

任何人都知道如何在页面上找到第一个.r元素并点击其中的链接?

这是我行动的开始:

require 'open-uri'
require 'nokogiri'
require 'mechanize'
document = open("https://www.google.com/search?q=stackoverflow")
parsed_content = Nokogiri::HTML(document.read)

以下是Google搜索结果页面上的.r元素:

<h3 class="r">
  <a href="/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;url=https%3A%2F%2Fstackoverflow.com%2F" data-href="https://stackoverflow.com/">Stack Overflow</a>
</h3>

1 个答案:

答案 0 :(得分:0)

你应该确保你的问题是你的例子中的正确代码 - 它看起来不是,因为你不会在引号中包围url而css选择器是.r a而不是{{1 }}。您使用r是因为您想要使用.r a类访问元素内的链接。

无论如何,您可以使用详细here方法,如下所示:

r

我对此进行了测试,然后require 'open-uri' require 'nokogiri' require 'uri' base_url = "https://www.google.com/search?q=stackoverflow" document = open(base_url) parsed_content = Nokogiri::HTML(document.read) href = parsed_content.css('.r').first.children.first['href'] new_url = URI.join base_url, href new_document = open(new_url) 按预期重定向到StackOverflow。