【问题标题】:click on xpath link with Mechanize单击带有 Mechanize 的 xpath 链接
【发布时间】:2012-07-23 19:10:26
【问题描述】:

我想点击我用 xpath (nokogiri) 选择的带有 Mechanize 的链接。

这怎么可能?

    next_page = page.search "//div[@class='grid-dataset-pager']/span[@class='currentPage']/following-sibling::a[starts-with(@class, 'page')][1]"
    next_page.click

问题是nokogiri元素没有点击功能。

我无法读取 href (URL) 并发送 get 请求,因为该链接定义了 onclick 函数(无 href 属性)。

如果不可能,有什么替代方案?

【问题讨论】:

    标签: ruby xpath nokogiri mechanize mechanize-ruby


    【解决方案1】:
    1. 当您尝试仅查找一个元素时,请使用 page.at 而不是 page.search。

    2. 您可以使用 CSS 选择器语法使您的选择器更简单(更短):

      next_page = page.at('div.grid-dataset-pager > span.currentPage + a[class^="page"]')
      
    3. 如果您有 Nokogiri 元素、页面和 mechanize 对象来提供构造函数,您可以构建自己的 Link 实例:

      next_link = Mechanize::Page::Link.new( next_page, mech, page )
      next_link.click
      
    4. 但是,您可能不需要它,因为Mechanize#click 允许您提供一个字符串,其中包含要单击的锚点/按钮的文本。

      # Assuming this link text is unique on the page, which I suspect it is
      mech.click next_page.text
      
    5. 完全重新阅读问题后进行编辑:但是,这对您没有任何帮助,因为 Mechanize 不是网络浏览器!没有 JavaScript 引擎,因此不会(不能)为您执行 onclick。为此,您需要使用 Ruby 来控制真正的 Web 浏览器,例如使用Watir或Selenium或Celerity等。

    【讨论】:

      【解决方案2】:

      通常你会这样做:

      page.link_with(:node => next_link).click
      

      不过,正如 Phrogz 所说,这并不能真正做到你想要的。

      【讨论】:

        【解决方案3】:

        为什么不使用 hpricot 元素呢?只要链接具有“src”或“href”属性,Mechanize 就可以单击 hpricot 元素。尝试以下方式:

        page = agent.get("http://www.example.com")
        next_page = agent.click((page/"//your/xpath/a"))
        

        编辑 在阅读了 Phrogz 的回答后,我也意识到这并不会真正做到。 Mechanize 还不支持 Javascript。考虑到这一点,您有 3 个选项。

        1. 使用控制真实网络浏览器的库。请参阅@Phrogz 的答案。
        2. 使用Capybara,它是一个集成测试库,但也可以用作独立的爬虫。我已经使用HTMLUnit 成功完成了这项工作,这也是Java 中的一个集成测试库。 Capybara 默认支持 Selenium,尽管它也通过外部 gem 支持 Webkit。 Capybara 开箱即用地解释 Javascript。这个blog post 可能会有所帮助。
        3. 深入了解您打算抓取的页面并使用 HTTPFox 之类的内容来监控 onclick Javascript 函数的作用,并将其复制到您的 Mechanize 脚本中。

        祝你好运。

        【讨论】:

        • hpricot 在三年前是如此。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        相关资源
        最近更新 更多