2012-07-25 92 views
3

我想点击与xpath(nokogiri)选择的Mechanize链接。点击与机械化的xpath链接

这怎么可能?

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)并发送获取请求,因为该链接已定义onclick函数(无href属性)。

如果这是不可能的,有什么选择?

回答

10
  1. 使用page.at,而不是当你试图page.search发现只有一个元素。

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

    next_page = page.at('div.grid-dataset-pager > span.currentPage + a[class^="page"]') 
    
  3. 如果你有引入nokogiri元素,页面您可以构建自己的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. 编辑重新阅读的问题完全:但是,这一切都不是要帮助你,因为机械化是不是一个网页浏览器!它没有JavaScript引擎,因此不会为您执行onclick。为此,您需要使用Ruby来控制真实的Web浏览器,例如使用WatirSeleniumCelerity等。

0

为什么不使用hpricot元素呢?只要链接具有'src'或'href'属性,机械化就可以点击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集成测试库。水豚默认支持Selenium,但它也支持Webkit通过外部gem。水豚解读开箱即用的Javascript。这blog post可能会有所帮助。
  3. Grok您想要抓取的页面,并使用诸如HTTPFox之类的东西来监视onclick Javascript函数的功能,并在您的Mechanize脚本中复制此功能。

祝你好运。

+1

hpricot是三年前的* so *。 – pguardiario 2012-07-26 01:49:20

3

一般来说,你会怎么做:

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

但是像Phrogz说,这不会真的做你想做的。