Captura de pantalla de aspx con Python Mechanize – Envío de formularios Javascript

Estoy tratando de raspar los datos de la Agencia de Calificación de Alimentos del Reino Unido ( aspx seach results) (p. Ej., G http://ratings.food.gov.uk/QuickSearch.aspx?q=po30 ) usando Mechanize / Python en scraperwiki ( http: / /scraperwiki.com/scrapers/food_standards_agency/ ) pero surge un problema al intentar seguir los enlaces de la página “siguiente” que tienen la forma:

" id="ctl00_ContentPlaceHolder1_uxResults_uxNext" title="Next >" /> 

El manejador de formularios se ve como:

     

¿Una traza HTTP cuando hago clic manualmente en los siguientes enlaces muestra __EVENTTARGET como vacío? Todas las cunas que puedo encontrar en otros raspadores muestran la manipulación de __EVENTTARGET como la forma de manejar las páginas siguientes.

De hecho, no estoy seguro de cómo la página que quiero raspar carga la página siguiente. Independientemente de lo que arroje al raspador, solo se puede cargar la primera página de resultados. (Incluso poder cambiar el número de resultados por página sería útil, ¡pero tampoco puedo ver cómo hacerlo!)

Entonces, ¿alguna idea sobre cómo eliminar las páginas de resultados de 1 + N’th para N> 0?

Mechanize no maneja javascript, pero para este caso particular no es necesario.

Primero abrimos la página de resultados con mecanizar.

 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() 

Luego seleccionamos el formulario aspnet:

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

El formulario tiene 5 botones de envío. Queremos enviar el que nos lleve a la siguiente página de resultados:

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

Los otros botones de enviar en el formulario son:

 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 

En mecanizar podemos obtener información de formulario como esta:

 for form in br.forms(): print form 

Mechanize no maneja JavaScript.

Sin embargo, hay muchas formas de manejar esto, incluyendo QtWebKit , python-spidermonkey , HtmlUnit (con Jython) o SeleniumRC .

Aquí es cómo se podría hacer con 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') 

Vea también estas preguntas de SO relacionadas:

  1. Cómo hacer clic en un enlace que tiene JavaScript
  2. Haga clic en un enlace de JavaScript dentro de Python