如何点击Mechanize和Nokogiri中的链接?

时间:2014-02-25 08:09:19

标签: ruby nokogiri mechanize

我正在使用Mechanize来抓取Google电子钱包的订单数据。我正在捕获第一页的所有数据,但是,我需要自动链接到后续页面以获取更多信息。

#purchaseOrderPager-pagerNextButton将移至下一页,以便我可以获取更多要捕获的记录。元素看起来像这样。我需要点击它继续前进。

<a id="purchaseOrderPager-pagerNextButton" class="kd-button small right"
 href="purchaseorderlist?startTime=0&amp;...
;currentPageStart=1&amp;currentPageEnd=25&amp;inputFullText=">
<img src="https://www.gstatic.com/mc3/purchaseorder/page-right.png"></a>

然而,当我尝试以下操作时出现错误:

  next_page = @orders_page.search("#purchaseOrderPager-pagerNextButton")
  next_page.click

错误:

undefined method `click' for #<Nokogiri::XML::NodeSet:0x007f9019095550> (NoMethodError)

2 个答案:

答案 0 :(得分:6)

clickMechanize class的方法。

请尝试以下表格。

next_page = @orders_page.at("#purchaseOrderPager-pagerNextButton")
mechanize_instance.click(next_page)

注意mechanize_instance替换为实际变量。

答案 1 :(得分:3)

你的那个不起作用,因为#search给了Nokogiri::XML::NodeSet个实例。 NodeSet 是节点的集合。但在您的情况下,next_page NodeSet 集合,它只包含一个元素。 first会为您提供Nokogiri::XML::Node,也是Nokogiri::XML::Element

写如下:

next_page = @orders_page.search("#purchaseOrderPager-pagerNextButton").first

或者更好地使用#at方法。

next_page = @orders_page.at("#purchaseOrderPager-pagerNextButton")

现在#clickMechanize::Page::Link实例的方法。打开源:

# File lib/mechanize/page/link.rb, line 29
def click
  @mech.click self
end

以下是完整代码: -

next_page = @orders_page.at("#purchaseOrderPager-pagerNextButton")
# mech is your Mechanize object.
next_link = Mechanize::Page::Link.new( next_page, mech, @orders_page )
next_link.click

Mechanize#click允许您提供带有锚点 / 按钮文本的字符串,以便点击和Nokogiri::XML::Node。所以我们可以这样做:

mech.click next_page

让我们看看为什么上面的代码会起作用:

source code lines

  referer = current_page()
  href = link.respond_to?(:href) ? link.href :
    (link['href'] || link['src'])
  get href, [], referer