|
|
@@ -0,0 +1,85 @@ |
|
|
|
""" |
|
|
|
This is the scraper for Hastings. |
|
|
|
""" |
|
|
|
|
|
|
|
import urllib2 |
|
|
|
import urllib |
|
|
|
import urlparse |
|
|
|
|
|
|
|
import datetime, time |
|
|
|
import cgi |
|
|
|
|
|
|
|
from BeautifulSoup import BeautifulSoup |
|
|
|
|
|
|
|
from PlanningUtils import PlanningApplication, \ |
|
|
|
PlanningAuthorityResults, \ |
|
|
|
getPostcodeFromText |
|
|
|
|
|
|
|
date_format = "%d/%m/%Y" |
|
|
|
|
|
|
|
class HastingsParser: |
|
|
|
def __init__(self, *args): |
|
|
|
|
|
|
|
self.authority_name = "Hastings Borough Council" |
|
|
|
self.authority_short_name = "Hastings" |
|
|
|
# self.base_url = "http://www.hastings.gov.uk/planning/view_applications.aspx" |
|
|
|
self.base_url = "http://www.hastings.gov.uk/planning/SearchResults.aspx" |
|
|
|
|
|
|
|
# Due to the idiotic design of the Hastings site, we can't give a proper info url. |
|
|
|
# There is a sensible URL, but it only works with a referer. |
|
|
|
self.info_url = "http://www.hastings.gov.uk/planning/view_applications.aspx" |
|
|
|
|
|
|
|
self.comment_url_template = "http://www.hastings.gov.uk/planning/planningapp_comments.aspx?appNumber=%s&syskey=%s" |
|
|
|
|
|
|
|
self._results = PlanningAuthorityResults(self.authority_name, self.authority_short_name) |
|
|
|
|
|
|
|
|
|
|
|
def getResultsByDayMonthYear(self, day, month, year): |
|
|
|
search_day = datetime.date(year, month, day) |
|
|
|
|
|
|
|
post_data = urllib.urlencode(( |
|
|
|
("type", "app"), |
|
|
|
("time", "0"), |
|
|
|
)) |
|
|
|
|
|
|
|
# Now get the search page |
|
|
|
response = urllib2.urlopen(self.base_url, post_data) |
|
|
|
soup = BeautifulSoup(response.read()) |
|
|
|
|
|
|
|
caseno_strings = soup.findAll(text="Case No:") |
|
|
|
|
|
|
|
for caseno_string in caseno_strings: |
|
|
|
application = PlanningApplication() |
|
|
|
|
|
|
|
application.council_reference = caseno_string.findNext("a").string.strip() |
|
|
|
info_url = urlparse.urljoin(self.base_url, caseno_string.findNext("a")['href']) |
|
|
|
|
|
|
|
# See above for why we can't use the proper info url. |
|
|
|
application.info_url = self.info_url |
|
|
|
|
|
|
|
# In order to avoid doing a download to find the comment page, we'll |
|
|
|
# get the system key from this url |
|
|
|
|
|
|
|
syskey = cgi.parse_qs(urlparse.urlsplit(info_url)[3])['id'][0] |
|
|
|
|
|
|
|
application.date_received = datetime.datetime.strptime(caseno_string.findNext(text="Registration Date:").findNext("p").string.strip(), date_format).date() |
|
|
|
|
|
|
|
application.address = caseno_string.findNext(text="Location:").findNext("p").string.strip() |
|
|
|
application.postcode = getPostcodeFromText(application.address) |
|
|
|
|
|
|
|
application.description = caseno_string.findNext(text="Proposal:").findNext("p").string.strip() |
|
|
|
|
|
|
|
#http://www.hastings.gov.uk/planning/planningapp_comments.aspx?appNumber=HS/FA/08/00631&syskey=95642 |
|
|
|
application.comment_url = self.comment_url_template %(application.council_reference, syskey) |
|
|
|
|
|
|
|
self._results.addApplication(application) |
|
|
|
|
|
|
|
return self._results |
|
|
|
|
|
|
|
def getResults(self, day, month, year): |
|
|
|
return self.getResultsByDayMonthYear(int(day), int(month), int(year)).displayXML() |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
parser = HastingsParser() |
|
|
|
print parser.getResults(2,9,2008) |
|
|
|
|