@@ -0,0 +1,88 @@ | |||
import urllib2 | |||
import urllib | |||
import urlparse | |||
import datetime, time | |||
import cgi | |||
from BeautifulSoup import BeautifulSoup | |||
from PlanningUtils import PlanningApplication, \ | |||
PlanningAuthorityResults, \ | |||
getPostcodeFromText | |||
class FifeParser: | |||
def __init__(self, *args): | |||
self.authority_name = "Fife Council" | |||
self.authority_short_name = "Fife" | |||
self.base_url = "http://www.fifedirect.org.uk/topics/index.cfm" | |||
self.comment_url = "http://www.ukplanning.com/ukp/showCaseFile.do?councilName=Fife+Council&appNumber=%s" | |||
self._results = PlanningAuthorityResults(self.authority_name, self.authority_short_name) | |||
def getResultsByDayMonthYear(self, day, month, year): | |||
search_date = datetime.date(year, month, day) | |||
search_data = urllib.urlencode( | |||
[("fuseaction", "planapps.list"), | |||
("SUBJECTID", "104CC166-3ED1-4D22-B9F1E2FB8438478A"), | |||
("src_fromdayRec", day), | |||
("src_frommonthRec", month), | |||
("src_fromyearRec", year), | |||
("src_todayRec", day), | |||
("src_tomonthRec", month), | |||
("src_toyearRec", year), | |||
("findroadworks", "GO"), | |||
] | |||
) | |||
search_url = self.base_url + "?" + search_data | |||
response = urllib2.urlopen(search_url) | |||
soup = BeautifulSoup(response.read()) | |||
results_table = soup.find("table", id="results") | |||
# Apart from the first tr, which contains headers, the trs come in pairs for each application | |||
trs = results_table.findAll("tr")[1:] | |||
tr_count = 0 | |||
while tr_count < len(trs): | |||
tr = trs[tr_count] | |||
if tr_count % 2 == 0: | |||
application = PlanningApplication() | |||
application.date_received = search_date | |||
tds = tr.findAll("td") | |||
application.council_reference = tds[0].a.string.strip() | |||
application.comment_url = self.comment_url %(application.council_reference) | |||
application.info_url = urlparse.urljoin(self.base_url, tds[0].a['href']) | |||
application.address = ', '.join([x.strip() for x in tds[1].findAll(text=True)]) | |||
application.postcode = getPostcodeFromText(application.address) | |||
else: | |||
# Get rid of the "Details: " at the beginning. | |||
application.description = tr.td.string.strip()[9:] | |||
self._results.addApplication(application) | |||
tr_count += 1 | |||
return self._results | |||
def getResults(self, day, month, year): | |||
return self.getResultsByDayMonthYear(int(day), int(month), int(year)).displayXML() | |||
if __name__ == '__main__': | |||
parser = FifeParser() | |||
print parser.getResults(21,5,2008) | |||
# TODO | |||
# Paginates at 50. Unlikely on a single day, so we'll worry about it later. |
@@ -0,0 +1,75 @@ | |||
import urllib2 | |||
import urllib | |||
import urlparse | |||
import datetime, time | |||
import cgi | |||
from BeautifulSoup import BeautifulSoup | |||
from PlanningUtils import PlanningApplication, \ | |||
PlanningAuthorityResults, \ | |||
getPostcodeFromText | |||
date_format = "%Y%m%d" | |||
class ForestOfDeanParser: | |||
def __init__(self, *args): | |||
self.authority_name = "Forest of Dean District Council" | |||
self.authority_short_name = "Forest of Dean" | |||
self.base_url = "http://www.fdean.gov.uk/content.asp" | |||
self._results = PlanningAuthorityResults(self.authority_name, self.authority_short_name) | |||
def getResultsByDayMonthYear(self, day, month, year): | |||
search_date = datetime.date(year, month, day) | |||
search_data = urllib.urlencode( | |||
[ | |||
("parent_directory_id", "200"), | |||
("nav", "679"), | |||
("id", "13266"), | |||
("RecStart", "1"), | |||
("RecCount", "100"), | |||
("SDate", search_date.strftime(date_format)), | |||
("EDate", search_date.strftime(date_format)), | |||
] | |||
) | |||
search_url = self.base_url + "?" + search_data | |||
response = urllib2.urlopen(search_url) | |||
soup = BeautifulSoup(response.read()) | |||
results_table = soup.find("table", summary="List of planning applications that match your query") | |||
for tr in results_table.findAll("tr")[1:]: | |||
application = PlanningApplication() | |||
application.date_received = search_date | |||
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.comment_url = application.info_url | |||
application.address = ' '.join(tds[1].string.strip().split()) | |||
application.postcode = getPostcodeFromText(application.address) | |||
application.description = tds[2].string.strip() | |||
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 = ForestOfDeanParser() | |||
print parser.getResults(21,5,2008) | |||
# TODO - looks like it paginates at 20 |
@@ -25,3 +25,5 @@ | |||
"Barnsley.py", "420" | |||
"Shetland.py", "420" | |||
"Kensington.py", "420" | |||
"Fife.py", "420" | |||
"ForestOfDean.py", "420" |
@@ -225,4 +225,5 @@ | |||
"The Royal Borough of Kensington and Chelsea", "Kensington and Chelsea", "", "Kensington", "KensingtonParser" | |||
"Comhairle Nan Eilean Siar", "Comhairle Nan Eilean Siar", "http://planning.cne-siar.gov.uk/PublicAccess/tdc/", "PublicAccess", "PublicAccessParser" | |||
"East Hampshire District Council", "East Hampshire", "http://planningdevelopment.easthants.gov.uk/dconline/acolnetcgi.gov?ACTION=UNWRAP&RIPNAME=Root.pgesearch", "AcolnetParser", "AcolnetParser" | |||
"Fife Council", "Fife", "", "Fife", "FifeParser" | |||
"Forest of Dean District Council", "Forest of Dean", "", "ForestOfDean", "ForestOfDeanParser" |