我知道如何使用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&rct=j&q=&esrc=s&source=web&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&rct=j&q=&esrc=s&source=web&url=https%3A%2F%2Fstackoverflow.com%2F" data-href="https://stackoverflow.com/">Stack Overflow</a>
</h3>
答案 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。