我想点击我用xpath(nokogiri)选择的机械化链接。
这怎么可能?
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属性)。
如果这不可能,有什么替代方案?
-
当您试图只查找一个元素时,请使用
page.at
而不是page.search
。 -
您可以使用CSS选择器语法使选择器更简单(更短):
next_page = page.at('div.grid-dataset-pager > span.currentPage + a[class^="page"]')
-
如果您有Nokogiri元素、页面和mechanize对象来向构造函数提供信息,那么您可以构造自己的
Link
实例:next_link = Mechanize::Page::Link.new( next_page, mech, page ) next_link.click
-
但是,您可能不需要,因为
Mechanize#click
允许您提供一个字符串,其中包含要单击的锚点/按钮的文本。# Assuming this link text is unique on the page, which I suspect it is mech.click next_page.text
-
完全重读问题后编辑:然而,这些都不会对你有帮助,因为机械化不是一个网络浏览器它没有JavaScript引擎,因此不会(不能)为您执行
onclick
。为此,您需要使用Ruby来控制真正的web浏览器,例如使用Watir、Selenium或Celerity等。
通常情况下,您会执行以下操作:
page.link_with(:node => next_link).click
然而,正如Phrogz所说,这并不能真正做到你想要的。
为什么不使用hpricot元素?只要链接具有"src"或"href"属性,机械化就可以单击hpricot元素。尝试以下方法:
page = agent.get("http://www.example.com")
next_page = agent.click((page/"//your/xpath/a"))
编辑在阅读Phrogz答案后,我也意识到这并不能真正做到这一点。机械化还不支持Javascript。考虑到这一点,您有三种选择。
- 使用控制真实web浏览器的库。参见@Phrogz答案
- 使用Capybara,它是一个集成测试库,但也可以用作独立的爬网程序。我已经用HTMLUnit成功地做到了这一点,HTMLUnit也是一个Java集成测试库。Capybara默认支持Selenium,但它也通过外部gem支持Webkit。Capybara开箱即用地解释Javascript。这篇博文可能会有所帮助
- Grok你打算抓取的页面,并使用HTTPFox之类的东西来监控onclick Javascript函数的作用,并在你的机械化脚本中复制它
祝你好运。