|
@@ -9,12 +9,10 @@ This is the PublicAccess url: |
|
|
http://publicaccess.westminster.gov.uk/publicaccess/ |
|
|
http://publicaccess.westminster.gov.uk/publicaccess/ |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
import urllib2 |
|
|
import urllib |
|
|
import urllib |
|
|
import urlparse |
|
|
import urlparse |
|
|
|
|
|
|
|
|
import pycurl |
|
|
|
|
|
import StringIO |
|
|
|
|
|
|
|
|
|
|
|
import datetime, time |
|
|
import datetime, time |
|
|
import cgi |
|
|
import cgi |
|
|
|
|
|
|
|
@@ -64,30 +62,15 @@ class WestminsterParser: |
|
|
|
|
|
|
|
|
# Now get the search page |
|
|
# Now get the search page |
|
|
|
|
|
|
|
|
sys.stderr.write("Fetching: %s\n" %self.base_url) |
|
|
|
|
|
sys.stderr.write("post data: %s\n" %post_data) |
|
|
|
|
|
|
|
|
# sys.stderr.write("Fetching: %s\n" %self.base_url) |
|
|
|
|
|
# sys.stderr.write("post data: %s\n" %post_data) |
|
|
|
|
|
|
|
|
|
|
|
response = urllib2.urlopen(self.base_url, post_data) |
|
|
|
|
|
|
|
|
# This gives us something to use as the callback |
|
|
|
|
|
fakefile = StringIO.StringIO() |
|
|
|
|
|
|
|
|
|
|
|
curlobj = pycurl.Curl() |
|
|
|
|
|
curlobj.setopt(pycurl.URL, self.base_url) |
|
|
|
|
|
curlobj.setopt(pycurl.POST, True) |
|
|
|
|
|
curlobj.setopt(pycurl.POSTFIELDS, post_data) |
|
|
|
|
|
curlobj.setopt(pycurl.WRITEFUNCTION, fakefile.write) |
|
|
|
|
|
curlobj.setopt(pycurl.FOLLOWLOCATION, True) |
|
|
|
|
|
curlobj.setopt(pycurl.MAXREDIRS, 10) |
|
|
|
|
|
|
|
|
|
|
|
curlobj.perform() |
|
|
|
|
|
|
|
|
|
|
|
sys.stderr.write("Got it\n") |
|
|
|
|
|
soup = BeautifulSoup(fakefile.getvalue()) |
|
|
|
|
|
|
|
|
# sys.stderr.write("Got it\n") |
|
|
|
|
|
soup = BeautifulSoup(response.read()) |
|
|
|
|
|
|
|
|
# We may as well free up the memory used by fakefile |
|
|
|
|
|
fakefile.close() |
|
|
|
|
|
|
|
|
|
|
|
sys.stderr.write("Created soup\n") |
|
|
|
|
|
|
|
|
# sys.stderr.write("Created soup\n") |
|
|
|
|
|
|
|
|
results_form = soup.find("form", {"name": "currentsearchresultsNext"}) |
|
|
results_form = soup.find("form", {"name": "currentsearchresultsNext"}) |
|
|
|
|
|
|
|
@@ -95,21 +78,21 @@ class WestminsterParser: |
|
|
# If there is no next page then there will be no inputs in the form. |
|
|
# If there is no next page then there will be no inputs in the form. |
|
|
# In this case, post_data will be '', which is false. |
|
|
# In this case, post_data will be '', which is false. |
|
|
|
|
|
|
|
|
sys.stderr.write("Found form containing results\n") |
|
|
|
|
|
|
|
|
# sys.stderr.write("Found form containing results\n") |
|
|
|
|
|
|
|
|
post_data = urllib.urlencode([(x['name'], x['value']) for x in results_form.findAll("input")]) |
|
|
post_data = urllib.urlencode([(x['name'], x['value']) for x in results_form.findAll("input")]) |
|
|
|
|
|
|
|
|
sys.stderr.write("Got post data\n") |
|
|
|
|
|
|
|
|
# sys.stderr.write("Got post data\n") |
|
|
|
|
|
|
|
|
# Each result has one link, and they are the only links in the form |
|
|
# Each result has one link, and they are the only links in the form |
|
|
|
|
|
|
|
|
links = results_form.findAll("a") |
|
|
links = results_form.findAll("a") |
|
|
|
|
|
|
|
|
sys.stderr.write("Got list of links\n") |
|
|
|
|
|
|
|
|
# sys.stderr.write("Got list of links\n") |
|
|
|
|
|
|
|
|
for link in links: |
|
|
for link in links: |
|
|
|
|
|
|
|
|
sys.stderr.write("Working on link: %s\n" %link['href']) |
|
|
|
|
|
|
|
|
# sys.stderr.write("Working on link: %s\n" %link['href']) |
|
|
|
|
|
|
|
|
application = PlanningApplication() |
|
|
application = PlanningApplication() |
|
|
|
|
|
|
|
@@ -124,25 +107,11 @@ class WestminsterParser: |
|
|
|
|
|
|
|
|
# To get the comment url, we're going to have to go to each info url :-( |
|
|
# To get the comment url, we're going to have to go to each info url :-( |
|
|
|
|
|
|
|
|
sys.stderr.write("Fetching: %s\n" %application.info_url) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fakefile = StringIO.StringIO() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
curlobj.setopt(pycurl.HTTPGET, True) |
|
|
|
|
|
curlobj.setopt(pycurl.WRITEFUNCTION, fakefile.write) |
|
|
|
|
|
|
|
|
|
|
|
# We have to convert the info url to ascii for curl |
|
|
|
|
|
curlobj.setopt(pycurl.URL, application.info_url.encode("ascii")) |
|
|
|
|
|
|
|
|
|
|
|
curlobj.perform() |
|
|
|
|
|
|
|
|
|
|
|
sys.stderr.write("Got it\n") |
|
|
|
|
|
|
|
|
|
|
|
info_soup = BeautifulSoup(fakefile.getvalue()) |
|
|
|
|
|
|
|
|
# sys.stderr.write("Fetching: %s\n" %application.info_url) |
|
|
|
|
|
info_response = urllib2.urlopen(application.info_url) |
|
|
|
|
|
# sys.stderr.write("Got it\n") |
|
|
|
|
|
|
|
|
fakefile.close() |
|
|
|
|
|
|
|
|
info_soup = BeautifulSoup(info_response) |
|
|
|
|
|
|
|
|
comment_nav_string = info_soup.find(text="Comment on this case") |
|
|
comment_nav_string = info_soup.find(text="Comment on this case") |
|
|
if comment_nav_string: |
|
|
if comment_nav_string: |
|
@@ -154,10 +123,10 @@ class WestminsterParser: |
|
|
|
|
|
|
|
|
self._results.addApplication(application) |
|
|
self._results.addApplication(application) |
|
|
|
|
|
|
|
|
sys.stderr.write("Finished that link\n") |
|
|
|
|
|
|
|
|
# sys.stderr.write("Finished that link\n") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sys.stderr.write("Finished while loop, returning stuff.\n") |
|
|
|
|
|
|
|
|
# sys.stderr.write("Finished while loop, returning stuff.\n") |
|
|
|
|
|
|
|
|
return self._results |
|
|
return self._results |
|
|
|
|
|
|
|
|