【问题标题】:stumped on clicking a link with nokogiri and mechanize难过点击与 nokogiri 和 mechanize 的链接
【发布时间】:2011-11-21 12:05:32
【问题描述】:

也许我做错了,或者还有另一种更有效的方法。这是我的问题:

我首先,使用 nokogiri 打开一个 html 文档并使用它的 css 遍历文档,直到找到我需要单击的链接。

现在,一旦我有了链接,我如何使用 mechanize 点击它?根据文档, Mechanize.new 返回的对象是字符串或 Mechanize::Page::Link 对象。

我不能使用字符串 - 因为可能有 100 个相同的链接 - 我只想机械化点击 nokogiri 遍历的链接。

有什么想法吗?

【问题讨论】:

    标签: ruby nokogiri mechanize


    【解决方案1】:

    找到需要的链接节点后,可以手动创建Mechanize::Page::Link对象,然后点击:

    agent = Mechanize.new
    page = agent.get "http://google.com"
    node = page.search ".//p[@class='posted']"
    Mechanize::Page::Link.new(node, agent, page).click
    

    【讨论】:

    • 这不是最好的方法。看看我的回答。
    • 我认为在某些情况下这个更好,即使不是最简单的。页面中有许多具有相同类的链接,但我需要知道我点击的是相对于表格单元格的链接,它是相对于另一个表格单元格的链接。所以我可以使用 Nokorigi 来查找该单元格,然后找到其中的链接。根据我所见,我无法使用 Mechanize link_with 做到这一点。
    【解决方案2】:

    比@binarycode 选项更简单的方法:

    agent = Mechanize.new
    page = agent.get "http://google.com"
    page.link_with(:class => 'posted').click
    

    【讨论】:

    • 当用于查找链接的条件非常简单时,您的方法是最好的。这里问题发布者使用 nokogiri 遍历文档,所以我提供了他可以使用 nokogiri 功能的解决方案,因此可以实现更复杂的逻辑来找到正确的链接。
    • 唯一的限制是节点必须响应.href['href']['src']
    【解决方案3】:

    那很简单,不用机械化link_with().click

    您只需get链接并更新您的page 变量

    Mechanize 在内部保存当前的工作站点,因此它足够聪明地跟踪本地链接

    例如:

    agent = Mechanize.new
    page = agent.get "http://somesite.com"
    
    next_page_link =  page.search('your exotic selectors here').first rescue nil  #nokogyri object 
    next_page_href =  next_page_link['href'] rescue nil  # '/local/link/file.html'
    
    page = agent.get(next_page_href) if next_page_href  # goes to 'http://somesite.com/local/link/file.html'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多