0

我想使用 Mechanize(使用 Python)提交表单,但不幸的是页面编码错误,<select>元素实际上不在<form>标签内。

所以我不能通过表格使用传统方法:

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

我能做些什么呢?

这是我想抓取的页面,以及相关的代码 - 我对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>
4

1 回答 1

1

这实际上比您想象的更复杂,但仍然很容易实现。正在发生的事情是,您链接的网页正在通过 JSON 拉入地方当局(这就是为什么name="la"选择元素没有填写 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 来完成!但是,您仍然需要一种方法来解析学校名称,然后再解析性能数据。

于 2012-06-15T15:22:44.387 回答