2012-06-14 2 views
0

Я хотел бы использовать Mechanize (с Python), чтобы отправить форму, но, к сожалению, страница была плохо кодирована, а элемент <select> на самом деле не находится внутри <form> тегов.Использовать Механизм с полем выбора, которое не находится внутри формы?

Так что я не могу использовать традиционный метод с помощью формы:

forms = [f for f in br.forms()] 
mycontrol = forms[1].controls[0] 

Что я могу сделать вместо этого?

Вот page I would like to scrape, и соответствующий бит кода - я заинтересован в la выбрать пункт:

<fieldset class="searchField"> 
     <label>By region/local authority</label> 
     <p id="regp"> 
     <label>Region</label> 
     <select id="region" name="region"><option></option></select> 
     </p> 
     <p id="lap"> 
     <label>Local authority</label> 
     <select id="la" name="la"><option></option></select> 
     </p> 
     <input id="byarea" type="submit" value="Go" /> 
     <img id="regmap" src="/schools/performance/img/map_england.png" alt="Map of regions in England" border="0" usemap="#England" /> 
    </fieldset> 

ответ

1

Это на самом деле более сложным, что вы думаете, но по-прежнему легко реализовать. Что происходит, так это то, что веб-страница, которую вы связываете, вытягивает в местных органах JSON (поэтому элемент select name="la" не заполняет Mechanize, в котором отсутствует Javascript). Самый простой способ - напрямую запросить данные JSON с помощью Python и использовать результаты для перехода непосредственно на каждую страницу данных.

import urllib2 
import json 

#The URL where we get our array of LA data 
GET_LAS = 'http://www.education.gov.uk/cgi-bin/schools/performance/getareas.pl?level=la&code=0' 

#The URL which we interpolate the LA ID into to get individual pages 
GET_URL = 'http://www.education.gov.uk/schools/performance/geo/la%s_all.html' 

def get_performance(la): 
    page = urllib2.urlopen(GET_URL % la) 
    #print(page.read()) 

#get the local authority list 
las = json.loads(urllib2.urlopen(GET_LAS).read()) 

for la in las: 
    if la != 0: 
     print('Processing LA ID #%s (%s)' % (la[0], la[1])) 
     get_performance(la[0]) 

Как вы можете видеть, вам даже не нужно загружать связанную страницу или использовать Механизацию для этого! Тем не менее, вам по-прежнему нужен способ разобрать имена школ, а затем показатели производительности.

+0

спасибо! Я должен был понять, что если бы не было внешнего элемента '

', он не мог бы представить форму и, следовательно, должен быть ссылкой. – flossfan

Смежные вопросы