2012-07-25 137 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說,這不會真的做你想做的。