3

我想单击使用 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 属性)。

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

4

3 回答 3

11
  1. 当您尝试仅查找一个元素时使用page.at而不是。page.search

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

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

    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 来控制真正的网络浏览器,例如使用WatirSeleniumCelerity等。

于 2012-07-25T22:28:06.497 回答
3

一般来说,你会这样做:

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

然而,就像 Phrogz 所说,这不会真正做到你想要的。

于 2012-07-26T01:48:58.437 回答
0

为什么不使用 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。这篇博文可能会有所帮助。
  3. Grok 您打算抓取的页面并使用HTTPFox之类的东西来监视 onclick Javascript 函数的作用,并将其复制到您的 Mechanize 脚本中。

祝你好运。

于 2012-07-25T15:17:25.207 回答