""" Lichfield District council has no nice search page, but it does have a page which has the applications received in the last 7 days, so we'll use this, ignoring the date passed in. """ import urllib2 import urlparse import re import datetime import BeautifulSoup from PlanningUtils import PlanningApplication, \ PlanningAuthorityResults, \ getPostcodeFromText date_format = "%d/%m/%Y" date_received_re = re.compile("(\d\d?)[a-z]{2} ([a-zA-Z]*) (\d{4})") class LichfieldParser: def __init__(self, *args): self.authority_name = "Lichfield District Council" self.authority_short_name = "Lichfield" self.base_url = "http://www.lichfielddc.gov.uk/site/scripts/planning_list.php" self._results = PlanningAuthorityResults(self.authority_name, self.authority_short_name) def getResultsByDayMonthYear(self, day, month, year): response = urllib2.urlopen(self.base_url) soup = BeautifulSoup.BeautifulSoup(response.read()) trs = soup.find("table", {"class": "planningtable"}).tbody.findAll("tr") for tr in trs: application = PlanningApplication() tds = tr.findAll("td") application.council_reference = tds[0].a.string.strip() application.info_url = urlparse.urljoin(self.base_url, tds[0].a['href']) application.address = ' '.join(tds[1].contents[1].strip().split()[1:]) application.postcode = getPostcodeFromText(application.address) # We're going to need to download the info page in order to get # the comment link, the date received, and the description. info_response = urllib2.urlopen(application.info_url) info_soup = BeautifulSoup.BeautifulSoup(info_response.read()) application.description = info_soup.find(text="Proposal").findNext(text=True).strip() date_received_str = info_soup.find(text="Date Application Valid").findNext(text=True).split(",")[1].strip() # This is a nasty botch, but the easiest way I can see to get a date out of this is to make another string and use strptime better_date_str = "%s %s %s" %date_received_re.match(date_received_str).groups() application.date_received = datetime.datetime.strptime(better_date_str, "%d %B %Y").date() application.comment_url = info_soup.find("a", title="Comment on this planning application.")['href'] 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 = LichfieldParser() print parser.getResults(20,11,2008)