import file_writer
from bs4 import BeautifulSoup
import renderer
import http.client
import re
class pollen_count_renderer(renderer.debuggable_abstaining_renderer):
def __init__(self, name_to_timeout_dict):
super(pollen_count_renderer, self).__init__(name_to_timeout_dict, False)
self.site = 'www.nwasthma.com'
self.uri = '/pollen/pollen-count/'
self.trees = []
self.grasses = []
self.weeds = []
def debug_prefix(self):
return "pollen"
def fetch_html(self):
conn = http.client.HTTPConnection(self.site)
conn.request(
"GET",
self.uri,
None,
{})
response = conn.getresponse()
if response.status != 200:
print(('Connection to %s/%s failed, status %d' % (self.site,
self.uri,
response.status)))
return False
return response.read()
def append_crap(self, text, tc, tr, tcomment, kind, maximum):
desc = ""
color = "#00d000"
if tr != None and tr.string != None:
desc = tr.string.encode('utf-8')
if "edium" in desc:
color = "#a0a000"
elif "igh" in desc:
color = "#d00000"
count = 0
if tc != None and tc.string != None:
try:
count = int(tc.string.encode('utf-8'))
except:
count = 0
proportion = float(count) / float(maximum)
width = int(proportion * 600.0)
comment = ""
if tcomment != None and tcomment.string != None:
comment = "%s" % (tcomment.string.encode('utf-8'))
# Label:
text = text + '
%s: | ' % (kind)
# Bar graph with text in it (possibly overspilling):
text = text + '' % (width, color)
text = text + 'count=%d, %s %s ' % (count, desc, comment)
return text
def munge(self, raw):
soup = BeautifulSoup(raw, "html.parser")
text = """
Pollen Count, Seattle
"""
date = "Unknown Date"
for x in soup.find_all('p'):
if x == None or x.string == None:
continue
txt = x.string.encode('utf-8')
m = re.match("[0-9][0-9].[0-9][0-9].20[0-9][0-9]", txt)
if m != None:
date = "%s" % (txt)
y = x.find_next_sibling('p')
if y != None and y.string != None:
txt = y.string.encode('utf-8')
date = date + " %s " % txt
text = text + '%s | \n' % (
date)
trees = soup.find('td', text=re.compile('[Tt]rees:'))
if trees != None:
tc = trees.find_next_sibling('td')
tr = tc.find_next_sibling('td')
tcomment = tr.find_next_sibling('td')
text = self.append_crap(text, tc, tr, tcomment, "Trees", 650)
grasses = soup.find('td', text=re.compile('[Gg]rasses:'))
if grasses != None:
gc = grasses.find_next_sibling('td')
gr = gc.find_next_sibling('td')
gcomment = gr.find_next_sibling('td')
text = self.append_crap(text, gc, gr, gcomment, "Grasses", 35)
weeds = soup.find('td', text=re.compile('[Ww]eeds:'))
if weeds != None:
wc = weeds.find_next_sibling('td')
wr = wc.find_next_sibling('td')
wcomment = wr.find_next_sibling('td')
text = self.append_crap(text, wc, wr, wcomment, "Weeds", 25)
text = text + """
Absent: No symptoms.
Low: Only individuals extremely sensitive to these pollens will experience symptoms.
Moderate: Many individuals sensitive to these pollens will experience symptoms
High: Most individuals with any sensitivity to these pollens will experience symptoms.
Very High: Almost all individuals with any sensitivity at all to these pollens will experience symptoms. Extremely sensitive people could have severe problems.
|
"""
return text
def poll_pollen(self):
raw = self.fetch_html()
cooked = self.munge(raw)
f = file_writer.file_writer('pollen_4_360.html')
f.write(cooked)
f.close()
return True
def periodic_render(self, key):
self.debug_print("executing action %s" % key)
if key == "Poll":
return self.poll_pollen()
else:
raise error("Unknown operaiton")
#test = pollen_count_renderer({"Test", 123})
|