2012-06-14 68 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拉入當地政府機構(這就是爲什麼name="la" select元素沒有填充Mechanize,它缺少Javascript)。最簡單的方法是直接用Python請求這個JSON數據,並使用結果直接進入每個數據頁面。

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

正如你所看到的,你甚至不需要加載你鏈接的頁面或使用Mechanize來做到這一點!但是,您仍然需要一種方法來解析出學校名稱,然後再分析表現數字。

+0

非常感謝!我應該意識到,如果沒有'

'外部元素,它不可能提交表單,因此必須是鏈接。 – flossfan