点击与机械化的xpath链接
问题描述:
我想点击与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属性)。
如果这是不可能的,有什么选择?
答
使用
page.at
,而不是当你试图page.search
发现只有一个元素。-
您可以通过使用CSS选择器语法让你的选择更简单的(短):
next_page = page.at('div.grid-dataset-pager > span.currentPage + a[class^="page"]')
-
如果你有引入nokogiri元素,页面您可以构建自己的
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等。
答
为什么不使用hpricot元素呢?只要链接具有'src'或'href'属性,机械化就可以点击hpricot元素。试试沿着这些线路:
page = agent.get("http://www.example.com")
next_page = agent.click((page/"//your/xpath/a"))
编辑阅读Phrogz答案后,我也意识到,这不会真正做到这一点。 Mechanize不支持Javascript。考虑到这一点,你有3个选项。
- 使用控制真实网页浏览器的库。请参阅@Phrogz答案。
- 使用Capybara这是一个集成测试库,但也可以用作独立的爬虫。我用HTMLUnit成功完成了这个任务,这也是一个Java集成测试库。水豚默认支持Selenium,但它也支持Webkit通过外部gem。水豚解读开箱即用的Javascript。这blog post可能会有所帮助。
- Grok您想要抓取的页面,并使用诸如HTTPFox之类的东西来监视onclick Javascript函数的功能,并在您的Mechanize脚本中复制此功能。
祝你好运。
答
一般来说,你会怎么做:
page.link_with(:node => next_link).click
但是像Phrogz说,这不会真的做你想做的。
hpricot是三年前的* so *。 – pguardiario 2012-07-26 01:49:20