【问题标题】:How can I click on a specific link with Nokogori or Mechanize?如何点击 Nokogori 或 Mechanize 的特定链接?
【发布时间】:2017-11-12 20:11:45
【问题描述】:

我知道如何使用 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"

但这不是一个直接的 url,去那个 url 会出错。 data-href 值是直接 url,但我不知道如何获取该值 - 做同样的事情,除了 ...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>

【问题讨论】:

    标签: ruby nokogiri bots mechanize open-uri


    【解决方案1】:

    您应该确保您的问题是示例中的正确代码 - 看起来不是,因为您没有将 url 括在引号中,并且 css 选择器是 .r a 而不是 r。您使用.r a 是因为您想使用r 类访问元素内部的链接。

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

    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)
    

    我对此进行了测试,并且关注 new_url 并按预期重定向到 StackOverflow。

    【讨论】:

    • 很好,我输入而不是复制+粘贴。这很奇怪,这个确切的代码对我不起作用,但使用 ('.r').first.children.first['href']href 而不是 href.value,可以。
    • @JosefKrazinsky 你是对的,一定是自己复制粘贴出错了
    猜你喜欢
    • 2014-03-27
    • 2011-11-21
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多