本文整理汇总了Python中fiftystates.scrape.votes.Vote.other方法的典型用法代码示例。如果您正苦于以下问题:Python Vote.other方法的具体用法?Python Vote.other怎么用?Python Vote.other使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类fiftystates.scrape.votes.Vote
的用法示例。
在下文中一共展示了Vote.other方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: scrape_vote
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_vote(self, bill, date, url):
with self.urlopen(url) as page:
page = lxml.html.fromstring(page)
header = page.xpath("string(//h4[contains(@id, 'hdVote')])")
location = header.split(', ')[1]
if location.startswith('House'):
chamber = 'lower'
elif location.startswith('Senate'):
chamber = 'upper'
else:
raise ScrapeError("Bad chamber: %s" % chamber)
committee = ' '.join(location.split(' ')[1:]).strip()
if not committee or committee.startswith('of Representatives'):
committee = None
motion = ', '.join(header.split(', ')[2:]).strip()
yes_count = int(
page.xpath("string(//td[contains(@id, 'tdAyes')])"))
no_count = int(
page.xpath("string(//td[contains(@id, 'tdNays')])"))
excused_count = int(
page.xpath("string(//td[contains(@id, 'tdExcused')])"))
absent_count = int(
page.xpath("string(//td[contains(@id, 'tdAbsent')])"))
other_count = excused_count + absent_count
passed = yes_count > no_count
if motion.startswith('Do Pass'):
type = 'passage'
elif motion == 'Concurred in amendments':
type = 'amendment'
elif motion == 'Veto override':
type = 'veto_override'
else:
type = 'other'
vote = Vote(chamber, date, motion, passed, yes_count, no_count,
other_count)
vote['type'] = type
if committee:
vote['committee'] = committee
vote.add_source(url)
for td in page.xpath("//table[contains(@id, 'tblVotes')]/tr/td"):
if td.text == 'Yea':
vote.yes(td.getprevious().text.strip())
elif td.text == 'Nay':
vote.no(td.getprevious().text.strip())
elif td.text in ('Excused', 'Absent'):
vote.other(td.getprevious().text.strip())
bill.add_vote(vote)
示例2: parse_vote_new
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def parse_vote_new(self, bill, chamber, url):
vote_page = BeautifulSoup(self.urlopen(url))
table = vote_page.table
info_row = table.findAll('tr')[1]
date = info_row.td.contents[0]
date = dt.datetime.strptime(date, '%m/%d/%Y')
motion = info_row.findAll('td')[1].contents[0]
yes_count = int(info_row.findAll('td')[2].contents[0])
no_count = int(info_row.findAll('td')[3].contents[0])
abs_count = int(info_row.findAll('td')[4].contents[0])
passed = info_row.findAll('td')[5].contents[0] == 'Pass'
vote = Vote(chamber, date, motion, passed,
yes_count, no_count, abs_count)
vote.add_source(url)
for tr in table.findAll('tr')[3:]:
if len(tr.findAll('td')) != 2:
continue
name = tr.td.contents[0].split(' of')[0]
type = tr.findAll('td')[1].contents[0]
if type.startswith('Yea'):
vote.yes(name)
elif type.startswith('Nay'):
vote.no(name)
else:
vote.other(name)
bill.add_vote(vote)
示例3: apply_votes
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def apply_votes(self, bill):
"""Given a bill (and assuming it has a status_url in its dict), parse all of the votes
"""
bill_votes = votes.all_votes_for_url(self, bill['status_url'])
for (chamber,vote_desc,pdf_url,these_votes) in bill_votes:
try:
date = vote_desc.split("-")[-1]
except IndexError:
self.warning("[%s] Couldn't get date out of [%s]" % (bill['bill_id'],vote_desc))
continue
yes_votes = []
no_votes = []
other_votes = []
for voter,vote in these_votes.iteritems():
if vote == 'Y':
yes_votes.append(voter)
elif vote == 'N':
no_votes.append(voter)
else:
other_votes.append(voter)
passed = len(yes_votes) > len(no_votes) # not necessarily correct, but not sure where else to get it. maybe from pdf
vote = Vote(standardize_chamber(chamber),date,vote_desc,passed, len(yes_votes), len(no_votes), len(other_votes),pdf_url=pdf_url)
for voter in yes_votes:
vote.yes(voter)
for voter in no_votes:
vote.no(voter)
for voter in other_votes:
vote.other(voter)
bill.add_vote(vote)
示例4: scrape
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape(self, chamber, session):
self.validate_session(session)
if chamber == 'upper':
other_chamber = 'lower'
bill_id = 'SB 1'
else:
other_chamber = 'upper'
bill_id = 'HB 1'
b1 = Bill(session, chamber, bill_id, 'A super bill')
b1.add_source('http://example.com/')
b1.add_version('As Introduced', 'http://example.com/SB1.html')
b1.add_document('Google', 'http://google.com')
b1.add_sponsor('primary', 'Bob Smith')
b1.add_sponsor('secondary', 'Johnson, Sally')
d1 = datetime.datetime.strptime('1/29/2010', '%m/%d/%Y')
v1 = Vote('upper', d1, 'Final passage', True, 2, 0, 0)
v1.yes('Smith')
v1.yes('Johnson')
d2 = datetime.datetime.strptime('1/30/2010', '%m/%d/%Y')
v2 = Vote('lower', d2, 'Final passage', False, 0, 1, 1)
v2.no('Bob Smith')
v2.other('S. Johnson')
b1.add_vote(v1)
b1.add_vote(v2)
b1.add_action(chamber, 'introduced', d1)
b1.add_action(chamber, 'read first time', d2)
b1.add_action(other_chamber, 'introduced', d2)
self.save_bill(b1)
示例5: scrape_vote
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_vote(self, bill, name, url):
match = re.match('^(Senate|House) Vote on [^,]*,(.*)$', name)
if not match:
return
chamber = {'Senate': 'upper', 'House': 'lower'}[match.group(1)]
motion = match.group(2).strip()
if motion.startswith('FINAL PASSAGE'):
type = 'passage'
elif motion.startswith('AMENDMENT'):
type = 'amendment'
elif 'ON 3RD READINT' in motion:
type = 'reading:3'
else:
type = 'other'
vote = Vote(chamber, None, motion, None,
None, None, None)
vote['type'] = type
vote.add_source(url)
with self.urlopen(url) as text:
(fd, temp_path) = tempfile.mkstemp()
with os.fdopen(fd, 'wb') as w:
w.write(text)
html = pdf_to_lxml(temp_path)
os.remove(temp_path)
vote_type = None
total_re = re.compile('^Total--(\d+)$')
body = html.xpath('string(/html/body)')
for line in body.replace(u'\xa0', '\n').split('\n'):
line = line.replace(' ', '').strip()
if not line:
continue
if line in ('YEAS', 'NAYS', 'ABSENT'):
vote_type = {'YEAS': 'yes', 'NAYS': 'no',
'ABSENT': 'other'}[line]
elif vote_type:
match = total_re.match(line)
if match:
vote['%s_count' % vote_type] = int(match.group(1))
elif vote_type == 'yes':
vote.yes(line)
elif vote_type == 'no':
vote.no(line)
elif vote_type == 'other':
vote.other(line)
# The PDFs oddly don't say whether a vote passed or failed.
# Hopefully passage just requires yes_votes > not_yes_votes
if vote['yes_count'] > (vote['no_count'] + vote['other_count']):
vote['passed'] = True
else:
vote['passed'] = False
bill.add_vote(vote)
示例6: scrape_vote
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_vote(self, bill, name, url):
match = re.match("^(Senate|House) Vote on [^,]*,(.*)$", name)
if not match:
return
chamber = {"Senate": "upper", "House": "lower"}[match.group(1)]
motion = match.group(2).strip()
if motion.startswith("FINAL PASSAGE"):
type = "passage"
elif motion.startswith("AMENDMENT"):
type = "amendment"
elif "ON 3RD READINT" in motion:
type = "reading:3"
else:
type = "other"
vote = Vote(chamber, None, motion, None, None, None, None)
vote["type"] = type
vote.add_source(url)
with self.urlopen(url) as text:
(fd, temp_path) = tempfile.mkstemp()
with os.fdopen(fd, "wb") as w:
w.write(text)
html = pdf_to_lxml(temp_path)
os.remove(temp_path)
vote_type = None
total_re = re.compile("^Total--(\d+)$")
body = html.xpath("string(/html/body)")
for line in body.replace(u"\xa0", "\n").split("\n"):
line = line.replace(" ", "").strip()
if not line:
continue
if line in ("YEAS", "NAYS", "ABSENT"):
vote_type = {"YEAS": "yes", "NAYS": "no", "ABSENT": "other"}[line]
elif vote_type:
match = total_re.match(line)
if match:
vote["%s_count" % vote_type] = int(match.group(1))
elif vote_type == "yes":
vote.yes(line)
elif vote_type == "no":
vote.no(line)
elif vote_type == "other":
vote.other(line)
# The PDFs oddly don't say whether a vote passed or failed.
# Hopefully passage just requires yes_votes > not_yes_votes
if vote["yes_count"] > (vote["no_count"] + vote["other_count"]):
vote["passed"] = True
else:
vote["passed"] = False
bill.add_vote(vote)
示例7: record_votes
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def record_votes(root):
for el in root.xpath(u'//p[starts-with(., "Yeas \u2014")]'):
text = ''.join(el.getprevious().itertext())
text.replace('\n', ' ')
m = re.search(r'(?P<bill_id>\w+\W+\d+)(,?\W+as\W+amended,?)?\W+was\W+'
'(?P<type>adopted|passed'
'(\W+to\W+(?P<to>engrossment|third\W+reading))?)\W+'
'by\W+\(Record\W+(?P<record>\d+)\):\W+'
'(?P<yeas>\d+)\W+Yeas,\W+(?P<nays>\d+)\W+Nays,\W+'
'(?P<present>\d+)\W+Present', text)
if m:
yes_count = int(m.group('yeas'))
no_count = int(m.group('nays'))
other_count = int(m.group('present'))
bill_id = m.group('bill_id')
if bill_id.startswith('H') or bill_id.startswith('CSHB'):
bill_chamber = 'lower'
elif bill_id.startswith('S') or bill_id.startswith('CSSB'):
bill_chamber = 'upper'
else:
continue
motion = get_motion(m)
type = get_type(motion)
vote = Vote(None, None, motion, True,
yes_count, no_count, other_count)
vote['bill_id'] = bill_id
vote['bill_chamber'] = bill_chamber
vote['session'] = '81'
vote['method'] = 'record'
vote['record'] = m.group('record')
vote['filename'] = m.group('record')
vote['type'] = type
for name in names(el):
vote.yes(name)
el = el.getnext()
if el.text and el.text.startswith('Nays'):
for name in names(el):
vote.no(name)
el = el.getnext()
while el.text and re.match(r'Present|Absent', el.text):
for name in names(el):
vote.other(name)
el = el.getnext()
vote['other_count'] = len(vote['other_votes'])
yield vote
else:
pass
示例8: scrape_old_vote
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_old_vote(self, url):
vote_page = self.soup_parser(self.urlopen(url))
header = vote_page.h3.contents[0]
chamber_name = header.split(', ')[1]
if chamber_name.startswith('House'):
chamber = 'lower'
else:
chamber = 'upper'
location = ' '.join(chamber_name.split(' ')[1:])
if location.startswith('of Representatives'):
location = ''
motion = ', '.join(header.split(', ')[2:])
def get_count(cell):
if len(cell.contents) == 0:
return 0
else:
return int(cell.contents[0])
results_tbl = vote_page.findAll('table')[1]
yes_count = get_count(results_tbl.findAll('td')[1])
no_count = get_count(results_tbl.findAll('td')[3])
excused_count = get_count(results_tbl.findAll('td')[5])
absent_count = get_count(results_tbl.findAll('td')[7])
other_count = excused_count + absent_count
passed = yes_count > no_count
vote = Vote(chamber, None, motion, passed,
yes_count, no_count,
other_count, excused_count=excused_count,
absent_count=absent_count,
location=location)
vote.add_source(url)
vote_tbl = vote_page.table
for td in vote_tbl.findAll('td'):
if td.contents[0] == 'Yea':
vote.yes(td.findPrevious().contents[0])
elif td.contents[0] == 'Nay':
vote.no(td.findPrevious().contents[0])
elif td.contents[0] in ['Excused', 'Absent']:
vote.other(td.findPrevious().contents[0])
return vote
示例9: scrape_lower_vote
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_lower_vote(self, url):
with self.urlopen(url) as page:
page = lxml.html.fromstring(page)
table = page.xpath("/html/body/table/tr[3]/td/table/tr/"
"td[3]/table/tr/td/table[3]")[0]
motion = ""
for part in ("Amendment Number", "Reading Number",
"Floor Actions"):
motion += page.xpath("string(//*[contains(text(), '%s')])" %
part).strip() + " "
motion = motion.strip()
date = page.xpath(
'string(//*[contains(text(), "Date:")]/following-sibling::*)')
date = datetime.datetime.strptime(date, "%m/%d/%Y")
yeas = page.xpath('string(//*[contains(text(), "Yeas")])')
yeas = int(yeas.split(' - ')[1])
nays = page.xpath('string(//*[contains(text(), "Nays")])')
nays = int(nays.split(' - ')[1])
nv = page.xpath('string(//*[contains(text(), "Not Voting")])')
nv = int(nv.split(' - ')[1])
passed = yeas > (nays + nv)
vote = Vote('lower', date, motion, passed, yeas, nays, nv)
vote.add_source(url)
for tr in table.xpath("tr/td/table/tr"):
text = tr.xpath("string()")
text = re.sub(r"\s+", r" ", text)
name = " ".join(text.split()[1:])
if text[0] == "Y":
vote.yes(name)
elif text[0] == "N":
vote.no(name)
elif text[0] in ("-", "C"):
vote.other(name)
return vote
示例10: scrape_new_vote
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_new_vote(self, url):
vote_page = self.soup_parser(self.urlopen(url))
header = vote_page.find(id="ctl00_contentMain_hdVote").contents[0]
chamber_name = header.split(', ')[1]
if chamber_name.startswith('House'):
chamber = 'lower'
else:
chamber = 'upper'
location = ' '.join(chamber_name.split(' ')[1:])
if location.startswith('of Representatives'):
location = ''
motion = ', '.join(header.split(', ')[2:])
yes_count = int(vote_page.find(
id="ctl00_contentMain_tdAyes").contents[0])
no_count = int(vote_page.find(
id="ctl00_contentMain_tdNays").contents[0])
excused_count = int(vote_page.find(
id="ctl00_contentMain_tdExcused").contents[0])
absent_count = int(vote_page.find(
id="ctl00_contentMain_tdAbsent").contents[0])
other_count = excused_count + absent_count
passed = yes_count > no_count
vote = Vote(chamber, None, motion, passed,
yes_count, no_count,
other_count, excused_count=excused_count,
absent_count=absent_count,
location=location)
vote.add_source(url)
vote_tbl = vote_page.find(id="ctl00_contentMain_tblVotes")
for td in vote_tbl.findAll('td'):
if td.contents[0] == 'Yea':
vote.yes(td.findPrevious().contents[0])
elif td.contents[0] == 'Nay':
vote.no(td.findPrevious().contents[0])
elif td.contents[0] in ['Excused', 'Absent']:
vote.other(td.findPrevious().contents[0])
return vote
示例11: scrape_votes
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_votes(self, bill_page, bill, insert, year):
root = lxml.html.fromstring(bill_page)
for link in root.xpath('//a[contains(text(), "Passage")]'):
motion = link.text
if 'Assembly' in motion:
chamber = 'lower'
else:
chamber = 'upper'
vote_url = 'http://www.leg.state.nv.us/Session/%s/Reports/%s' % (
insert, link.get('href'))
bill.add_source(vote_url)
with self.urlopen(vote_url) as page:
page = page.decode("utf8").replace(u"\xa0", " ")
root = lxml.html.fromstring(page)
date = root.xpath('string(/html/body/center/font)').split()[-1]
date = date + "-" + str(year)
date = datetime.strptime(date, "%m-%d-%Y")
yes_count = int(root.xpath('string(/html/body/center/table/tr/td[1])').split()[0])
no_count = int(root.xpath('string(/html/body/center/table/tr/td[2])').split()[0])
excused = int(root.xpath('string(/html/body/center/table/tr/td[3])').split()[0])
not_voting = int(root.xpath('string(/html/body/center/table/tr/td[4])').split()[0])
absent = int(root.xpath('string(/html/body/center/table/tr/td[5])').split()[0])
other_count = excused + not_voting + absent
passed = yes_count > no_count
vote = Vote(chamber, date, motion, passed, yes_count, no_count,
other_count, not_voting=not_voting, absent=absent)
for el in root.xpath('/html/body/table[2]/tr'):
name = el.xpath('string(td[1])').strip()
full_name = ''
for part in name:
full_name = full_name + part + " "
name = str(name)
vote_result = el.xpath('string(td[2])').split()[0]
if vote_result == 'Yea':
vote.yes(name)
elif vote_result == 'Nay':
vote.no(name)
else:
vote.other(name)
bill.add_vote(vote)
示例12: parse_vote
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def parse_vote(self, bill, actor, date, motion, url):
with self.urlopen(url) as page:
vote_re = re.compile('YEAS -?\s?(\d+)(.*)NAYS -?\s?(\d+)'
'(.*)ABSENT( OR NOT VOTING)? -?\s?'
'(\d+)(.*)',
re.MULTILINE | re.DOTALL)
match = vote_re.search(page)
yes_count = int(match.group(1))
no_count = int(match.group(3))
other_count = int(match.group(6))
if yes_count > no_count:
passed = True
else:
passed = False
if actor == 'upper' or actor == 'lower':
vote_chamber = actor
vote_location = ''
else:
vote_chamber = ''
vote_location = actor
vote = Vote(vote_chamber, date,
motion, passed, yes_count, no_count,
other_count,
location=vote_location)
vote.add_source(url)
yes_votes = re.split('\s{2,}', match.group(2).strip())
no_votes = re.split('\s{2,}', match.group(4).strip())
other_votes = re.split('\s{2,}', match.group(7).strip())
for yes in yes_votes:
if yes:
vote.yes(yes)
for no in no_votes:
if no:
vote.no(no)
for other in other_votes:
if other:
vote.other(other)
bill.add_vote(vote)
示例13: scrape_vote
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_vote(self, bill, chamber, url):
with self.urlopen(url) as page:
page = page.replace(' ', ' ')
page = lxml.html.fromstring(page)
info_row = page.xpath("//table[1]/tr[2]")[0]
date = info_row.xpath("string(td[1])")
date = datetime.datetime.strptime(date, "%m/%d/%Y")
motion = info_row.xpath("string(td[2])")
yes_count = int(info_row.xpath("string(td[3])"))
no_count = int(info_row.xpath("string(td[4])"))
other_count = int(info_row.xpath("string(td[5])"))
passed = info_row.xpath("string(td[6])") == 'Pass'
if motion == 'Shall the bill pass?':
type = 'passage'
elif motion == 'Shall the bill be read the third time?':
type = 'reading:3'
elif 'be amended as' in motion:
type = 'amendment'
else:
type = 'other'
vote = Vote(chamber, date, motion, passed,
yes_count, no_count, other_count)
vote.add_source(url)
for tr in page.xpath("//table[1]/tr")[3:]:
if len(tr.xpath("td")) != 2:
continue
name = tr.xpath("string(td[1])").split(' of')[0]
type = tr.xpath("string(td[2])").strip()
if type == 'Yea':
vote.yes(name)
elif type == 'Nay':
vote.no(name)
else:
vote.other(name)
bill.add_vote(vote)
示例14: scrape_votes
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_votes(self, bill_page, bill, chamber, insert, motion, year):
root = lxml.etree.fromstring(bill_page, lxml.etree.HTMLParser())
url_path = ('/html/body/div[@id="content"]/table[5]/tr/td/a')
for mr in root.xpath(url_path):
url_end = mr.xpath('string(@href)')
vote_url = 'http://www.leg.state.nv.us/Session/%s/Reports/%s' % (insert, url_end)
bill.add_source(vote_url)
with self.urlopen(vote_url) as page:
page = page.decode("utf8").replace(u"\xa0", " ")
root = lxml.etree.fromstring(page, lxml.etree.HTMLParser())
date = root.xpath('string(/html/body/center/font)').split()[-1]
date = date + "-" + str(year)
date = datetime.strptime(date, "%m-%d-%Y")
yes_count = root.xpath('string(/html/body/center/table/tr/td[1])').split()[0]
no_count = root.xpath('string(/html/body/center/table/tr/td[2])').split()[0]
excused = root.xpath('string(/html/body/center/table/tr/td[3])').split()[0]
not_voting = root.xpath('string(/html/body/center/table/tr/td[4])').split()[0]
absent = root.xpath('string(/html/body/center/table/tr/td[5])').split()[0]
other_count = 0
if yes_count > no_count:
passed = True
else:
passed = False
vote = Vote(chamber, date, motion, passed, int(yes_count), int(no_count), other_count, not_voting = int(not_voting), absent = int(absent))
for el in root.xpath('/html/body/table[2]/tr'):
name = el.xpath('string(td[1])').strip()
full_name = ''
for part in name:
full_name = full_name + part + " "
name = str(name)
vote_result = el.xpath('string(td[2])').split()[0]
if vote_result == 'Yea':
vote.yes(name)
elif vote_result == 'Nay':
vote.no(name)
else:
vote.other(name)
bill.add_vote(vote)
示例15: scrape_votes
# 需要导入模块: from fiftystates.scrape.votes import Vote [as 别名]
# 或者: from fiftystates.scrape.votes.Vote import other [as 别名]
def scrape_votes(self, vote_text, vote_url, house, date, bill):
votes_parts = vote_text.split(";")
voters = []
motion_text, sep, after = vote_text.partition(" The votes were as follows:")
for vp in votes_parts:
before, sep, after = vp.partition("(s)")
voters_list = after.split(", ")
voters_list[0] = voters_list[0].lstrip(" ")
voters_list[-1] = voters_list[-1].rstrip(". ")
voters.append(voters_list)
#Ayes, Ayes with reservations, Noes, Excused
vote_counts = [0, 0, 0, 0]
for i, t in enumerate(votes_parts):
match = re.search("[0-9]+", t)
if (match != None):
vote_counts[i] = int(match.group(0))
if(house == 'H'):
vote_house = "lower"
else:
vote_house = "upper"
vote = Vote(vote_house, date, motion_text, True, \
vote_counts[0], vote_counts[2], vote_counts[1] + vote_counts[3])
vote.add_source(vote_url)
for yes_voter in voters[0]:
vote.yes(yes_voter)
for no_voter in voters[2]:
vote.no(no_voter)
for other_voter in voters[1]:
vote.other(other_voter)
for other_voter in voters[2]:
vote.other(other_voter)
bill.add_vote(vote)