2011-05-24 18 views
6

Tôi đang cố gắng để trích xuất dữ liệu Ratings Anh Thực phẩm Cơ quan aspx Kết các trang kết quả sử dụng mechanize/Python trên scraperwiki (http://scraperwiki.com/scrapers/food_standards_agency/) nhưng đến với một (e, g http://ratings.food.gov.uk/QuickSearch.aspx?q=po30.) vấn đề khi cố gắng làm theo "bên cạnh" liên kết trang có dạng:Screenscaping aspx với Python mechanize - Hình thức nộp hồ sơ Javascript

<input type="submit" name="ctl00$ContentPlaceHolder1$uxResults$uxNext" value="Next >" id="ctl00_ContentPlaceHolder1_uxResults_uxNext" title="Next >" /> 

việc xử lý hình thức trông giống như:

<form method="post" action="QuickSearch.aspx?q=po30" onsubmit="javascript:return WebForm_OnSubmit();" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_ContentPlaceHolder1_buttonSearch')" id="aspnetForm"> 
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" /> 

Một dấu vết HTTP khi tôi tự bấm vào liên kết tiếp theo cho thấy __E VENTTARGET trống? Tất cả các nôi tôi có thể tìm thấy trên các scrapers khác cho thấy thao tác của __EVENTTARGET như là cách xử lý các trang tiếp theo.

Thật vậy, tôi không chắc chắn trang tôi muốn xóa bao giờ tải trang tiếp theo? Bất cứ điều gì tôi ném vào scraper, nó chỉ bao giờ quản lý để tải trang kết quả đầu tiên. (Ngay cả khi có thể thay đổi số lượng kết quả trên mỗi trang sẽ hữu ích, nhưng tôi không thể thấy cách thực hiện điều đó!)

Vì vậy - mọi ý tưởng về cách xóa các trang kết quả 1 + N'th N> 0?

Trả lời

8

mechanize doesn't xử lý javascript, nhưng đối với trường hợp cụ thể này, nó không phải là t cần thiết.

tiên chúng ta mở trang kết quả với mechanize

url = 'http://ratings.food.gov.uk/QuickSearch.aspx?q=po30' 
br = mechanize.Browser() 
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
br.open(url) 
response = br.response().read() 

Sau đó, chúng tôi chọn hình thức aspnet:

br.select_form(nr=0) #Select the first (and only) form - it has no name so we reference by number 

Các hình thức đã 5 nộp nút - chúng tôi muốn gửi một trong đó đưa chúng ta đến trang kết quả tiếp theo:

response = br.submit(name='ctl00$ContentPlaceHolder1$uxResults$uxNext').read() #"Press" the next submit button 

Các nút gửi khác trong biểu mẫu là:

ctl00$uxLanguageSwitch # Switch language to Welsh 
ctl00$ContentPlaceHolder1$uxResults$Button1 # Search submit button 
ctl00$ContentPlaceHolder1$uxResults$uxFirst # First result page 
ctl00$ContentPlaceHolder1$uxResults$uxPrevious # Previous result page 
ctl00$ContentPlaceHolder1$uxResults$uxLast # Last result page 

Trong mechanize chúng ta có thể nhận được thông tin dạng như thế này:

for form in br.forms(): 
    print form 
2

Cơ chế không xử lý JavaScript.

Có rất nhiều cách để xử lý này, tuy nhiên, trong đó có QtWebKit, python-spidermonkey, HtmlUnit (sử dụng Jython), hoặc SeleniumRC.

Sau đây là cách nó có thể được thực hiện với SeleniumRC:

import selenium 
sel=selenium.selenium("localhost",4444,"*firefox", "http://ratings.food.gov.uk") 
sel.start() 
sel.open("QuickSearch.aspx?q=po30") 
sel.click('ctl00$ContentPlaceHolder1$uxResults$uxNext') 

Xem thêm những liên quan SO câu hỏi:

  1. How to click a link that has JavaScript
  2. Click on a JavaScript link within Python