2013-12-09 8 views
1

주문 색인 페이지에서 모든 singleOrder (http://pastebin.com/FtiTBXG4)를 반복합니다. 내가하고 싶은 일은 주문에 대한 더 많은 정보를 분석 할 수 있도록 각 단일 주문 링크를 클릭하는 것입니다.Mechanize를 사용하여 링크를 클릭하여 주문의 세부 정보를 긁어 모으는 방법?

하지만 클릭 또는 반복이 작동하지 않는 것 같습니다. 첫 번째 주문을 계속 클릭하기 만하면됩니다. 이 문제를 해결하는 방법에 대한

CHECK 1 DASHBOARD SUCCESS 
CHECK 2 ORDERS SUCCESS 
http://www.exampleshop.nl/admin/index.php?route=sale/order/info&token=e29984974b56db4ba9d3c91a47d26f90&order_id=259 
http://www.exampleshop.nl/admin/index.php?route=sale/order/info&token=e29984974b56db4ba9d3c91a47d26f90&order_id=259 
http://www.exampleshop.nl/admin/index.php?route=sale/order/info&token=e29984974b56db4ba9d3c91a47d26f90&order_id=259 
... 

어떤 아이디어 :

require 'mechanize' 

a = Mechanize.new 

a.get('http://exampleshop.nl/admin/') do |page| 

    # Select the login form 
    login_form = page.forms.first 

    # Insert the username and password 
    login_form.username = 'username' 
    login_form.password = 'password' 

    # Submit the login information 
    dashboard_page = a.submit(login_form, login_form.buttons.first) 

    # Check if the login was successfull 
    puts check_1 = dashboard_page.title == 'Dashboard' ? "CHECK 1 DASHBOARD SUCCESS" : "CHECK 1 DASHBOARD FAIL" 

    # Visit the orders index page to scrape some standard information 
    orders_page = a.click(dashboard_page.link_with(:text => /Bestellingen/)) 

    # pp orders_page # => http://pastebin.com/L3zASer6 

    # Check if the visit is successful 
    puts check_2 = orders_page.title == 'Bestellingen' ? "CHECK 2 ORDERS SUCCESS" : "CHECK 2 ORDERS FAIL" 

    # Search for all #singleOrder table row's and put them in variable all_single_orders 
    all_single_orders = orders_page.search("#singleOrder") 

    # puts all_single_orders.class # => Nokogiri::XML::NodeSet 
    # puts all_single_orders    # => http://pastebin.com/FtiTBXG4 
    # pp all_single_orders     # => http://pastebin.com/UMRxGDn2 

    # Scrape the needed information (the actual save to database is omitted) 
    all_single_orders.each do |order| 
     # Fetch the standard information 
     puts orderId = order.search("#orderId").text    # => 259  
     puts customerName = order.search("#customerName").text  # => Firstname Lastname  
     puts orderStatus = order.search("#orderStatus").text  # => Bestelling ontvangen   
     puts orderAmount = order.search("#orderAmount").text   # => € 41,94 

     # pp order # => sample of a a single `order` iteration: http://pastebin.com/FkM8DVT8 

     # Visit a single order page to fetch more detailed information 
     single_order_page = orders_page.link_with(:text => /Bekijk/).click 

     # puts single_order_page.class # => Mechanize::Page 

     # Print the URI to check what page we're on 
     puts single_order_page.uri # => http://www.fonexshop.nl/admin/index.php?route=sale/order/info&token=SOMETOKEN&order_id=259 
    end 
end 

이 출력은 다음과 같습니다

여기에 내가 사용하고 코드인가? 임 루비 2.0.0 및 Mechanize 2.7.3을 사용하여. 여기

single_order_page = orders_page.link_with(:text => /Bekijk/).click 

텍스트 "Bekijk"로 페이지의 첫 번째 링크를 클릭 기계화을 말하고있다 :

답변

2

문제는 라인입니다. 이것은 주문 (예 : 테이블 행)이 아닌 페이지에서 첫 번째로 일치하는 링크를 찾습니다.

나는 당신이 순서대로 링크의 HREF를 얻고 그 href가 함께 링크를 클릭 (또는 직접 링크로 이동) 할 필요가 생각 :

all_single_orders.each do |order| 
    # Fetch the standard information 
    puts orderLink = order.at_css("a")['href'] #Assuming first link in row 

    # Visit a single order page to fetch more detailed information 
    single_order_page = orders_page.link_with(:href => orderLink).click 

    # Print the URI to check what page we're on 
    puts single_order_page.uri # => http://www.fonexshop.nl/admin/index.php?route=sale/order/info&token=SOMETOKEN&order_id=259 
end 
+0

가 나는'형식 오류를 받고 있어요 '에서 [] 안에 다음과 같은 메시지를 넣어서 : String을 Integer (TypeError)'로 암묵적으로 변환하지 마라. 원래 질문을 내가 한 것과 그 결과로 업데이트했습니다. 어떤 아이디어? – narzero

+0

죄송합니다.'search'는 요소가 아닌 노드 집합을 반환합니다. '검색'을 'at_css'로 변경했습니다. –

+0

지금 고맙습니다. – narzero

관련 문제