Skip to content

Instantly share code, notes, and snippets.

@andylolz
Last active August 29, 2015 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andylolz/b57748b9d050269ed862 to your computer and use it in GitHub Desktop.
Save andylolz/b57748b9d050269ed862 to your computer and use it in GitHub Desktop.
Find MP twitter accounts on Tweetminster; check if they're present on YourNextMP
from bs4 import BeautifulSoup
import requests
import time
import json
import re
#############################################
# #
# Find MP twitter accounts on Tweetminster; #
# check if they're present on YourNextMP #
# #
#############################################
### fetch all constituency IDs from MapIt
r = requests.get('http://mapit.mysociety.org/areas/WMC')
j = json.loads(r.text)
constituency_ids_by_name = {constituency['name']: id_ for id_, constituency in j.items()}
# constituency names in tweetminster are out of date
constituency_aliases = {
'Fife North East': 'North East Fife',
'Pontefract and Castleford': 'Normanton, Pontefract and Castleford',
'Normanton': 'Morley and Outwood',
'North Southwark and Bermondsey': 'Bermondsey and Old Southwark',
'Northavon': 'Thornbury and Yate',
'Durham, City of': 'City of Durham',
'Caernarfon': 'Arfon',
'Sheffield, Attercliffe': 'Sheffield South East',
'Liverpool, Garston': 'Garston and Halewood',
'Woodspring': 'North Somerset',
'Ruislip - Northwood': 'Ruislip, Northwood and Pinner',
'North Essex': 'Harwich and North Essex',
'Harwich and North Essex': 'Clacton',
'Hornchurch': 'Old Bexley and Sidcup',
'Westbury': 'South West Wiltshire',
'Plymouth, Devonport': 'Plymouth, Moor View',
'Gateshead East and Washington West': 'Washington and Sunderland West',
'Dagenham': 'Dagenham and Rainham',
'Birmingham, Hall Green': 'Birmingham, Selly Oak',
'Birmingham, Sparkbrook and Small Heath': 'Birmingham, Hall Green',
'Wentworth': 'Wentworth and Dearne',
'Wrekin, The': 'The Wrekin',
'Salford': 'Salford and Eccles',
'Regent\'s Park and Kensington North': 'Westminster North',
'Perth and Perthshire North': 'Perth and North Perthshire',
'Renfrewshire East': 'East Renfrewshire',
'Hampstead and Highgate': 'Hampstead and Kilburn',
'Worsley': 'Worsley and Eccles South',
'Selby': 'Selby and Ainsty',
}
### Fetch all MPs from tweetminster
tweetminster_tmpl = "http://tweetminster.co.uk/mps/page:%d"
page = 0
mps = {}
while True:
time.sleep(0.5)
page += 1
r = requests.get(tweetminster_tmpl % page)
soup = BeautifulSoup(r.text)
container = soup.find('section', {'class': 'ResultsContainer'})
if container.text.strip() == "No MPs were found.":
# we're done.
break
results = container.find_all('div', {'class': 'tweeters'})
for result in results:
constituency = result.h3.text
constituency = constituency_aliases.get(constituency, constituency)
constituency_id = constituency_ids_by_name[constituency]
details = [x for x in result.find('p', {'class': 'tweetTitle'}).children]
mp = {
'constituency': constituency,
'name': details[0].strip(),
'party': details[2].text,
'twitter': details[4].strip().replace('@', ''),
}
r = requests.get('https://twitter.com/%s' % mp['twitter'])
if r.status_code != 200:
print 'Hmm... Seems @%s doesn\'t exist.' % mp['twitter']
continue
mps[constituency_id] = mp
# # bit of logging
# print mps[constituency_id]
mp_aliases = {
'AlisonSeabeckMP': 'Alison Seabeck',
'DamianCollins': 'Damian Collins',
'Jeffrey M Donaldson': 'Jeffrey M. Donaldson',
'Jonathan Ashworth MP': 'Jon Ashworth',
'Gisela': 'Gisela Stuart',
'Andy Slaughter MP': 'Andrew Slaughter',
'Julie Ann Hilling': 'Julie Hilling',
'Sir Tony Baldry MP': 'Tony Baldry',
'Christopher Huhne': 'Chris Huhne',
'Dame Anne Begg MP': 'Anne Begg',
'Frank Field\'s Team': 'Frank Field',
'Jim Sheridan': 'James Sheridan',
'chi onwurah': 'Chinyelu Susan Onwurah',
'MarkSpencerMP': 'Mark Spencer',
'Steve Baker MP': 'Steven Baker',
'RogerWilliamsMP': 'Roger Williams',
'Vince Cable': 'Vincent Cable',
'tom_watson': 'Tom Watson',
'Dr Phillip Lee MP': 'Phillip Lee',
'Mike Weatherley MP': 'Michael Weatherley',
'paulcmaynard': 'Paul Maynard',
'MegHillierMP': 'Meg Hillier',
'Jonathan Reynolds MP': 'Jonny Reynolds',
'AnasSarwar': 'Anas Sarwar',
'William Bain': 'Willie Bain',
'Steve Barclay': 'Stephen Barclay',
'John McDonnell': 'John Martin McDonnell',
'Dr Liam Fox MP': 'Liam Fox',
'About David Heath MP': 'David Heath',
'Damian': 'Damian Green',
'stellacreasy': 'Stella Creasy',
'Maria_MillerMP': 'Maria Miller',
'Tessa Munt (MP)': 'Tessa Munt',
'Nic Dakin MP': 'Nicholas Dakin',
'R. Blackman-Woods': 'Roberta Blackman-Woods',
'Diana Johnson': 'Diana R. Johnson',
'JackDromeyMP': 'Jack Dromey',
'Minister Civ Soc': 'Nick Hurd',
}
### Mega confusing update code!
twitter_tweaks = {
'ChrisHuhne': None, # http://www.dailymail.co.uk/news/article-2046710/Chris-Huhne-Twitter-embarrassment-accidental-fingerprints-tweet.html
'TomHarrisMP': None, # http://www.telegraph.co.uk/news/politics/labour/9017295/Labour-MP-Tom-Harris-forced-to-resign-as-Twitter-tsar.html
'TweetBrooks': None, # http://www.mirror.co.uk/news/uk-news/disgraced-tory-brooks-newmark-caught-4421549
'DavidWrightMP': None, # http://www.lucyallan.com/news/lucy-calls-david-wright-mp-tweet-again
'Mark_Prisk': 'PriskMark',
'AMcDonnellMP': 'AlasdairMcD_MP',
'edwardleighac': 'EdwardLeighMP',
'MaryMacleod4MP': 'MaryMacleodMP',
'Craig_Whittaker': 'CraigWhi2kermp',
}
source = 'http://tweetminster.co.uk/mps'
ynmp_tmpl = 'http://yournextmp.popit.mysociety.org/api/v0.1/posts/%s?embed=membership.person.membership'
with requests.Session() as s:
time.sleep(0.5)
# Log in to yournextmp
login_page = 'https://yournextmp.com/accounts/login/'
r = s.get(login_page, verify=False)
token = re.search('csrfmiddlewaretoken\' value=\'(.*?)\'', r.text).group(1)
r = s.post(login_page, data={'login': ynmp_login, 'password': ynmp_password, 'csrfmiddlewaretoken': token}, verify=False, headers={'Referer': login_page})
for constituency_id, mp in mps.items():
time.sleep(0.5)
# fetch data for a given constituency
r = requests.get(ynmp_tmpl % constituency_id)
j = json.loads(r.text)
# fix known errors with tweetminster data
mp['twitter'] = twitter_tweaks.get(mp['twitter'], mp['twitter'])
if mp['twitter'] is None:
continue
twitter_handles = [x['person_id']['versions'][0]['data']['twitter_username'].lower() for x in j['result']['memberships'] if x['person_id']['versions'][0]['data']['twitter_username'] is not None]
if mp['twitter'].lower() in twitter_handles:
# everything is fine! We already have this twitter handle
continue
# fix some known discrepancies in MP naming
mp_name = re.sub(' mp$', '', mp_aliases.get(mp['name'], mp['name']).lower())
found = False
for ynmp_mp in j['result']['memberships']:
if mp_name == ynmp_mp['person_id']['name'].lower():
found = True
break
if not found:
# this was just here to help work out the mp_aliases
print 'Odd... Couldn\'t find %s in constituency %s' % (mp['name'], constituency_id)
continue
mp['id'] = ynmp_mp['person_id']['id']
current_twitter = ynmp_mp['person_id']['versions'][0]['data']['twitter_username']
# we only care about the case when there is no existing twitter handle.
# I checked the other cases manually, and made a couple of updates.
if current_twitter == '':
update_url = 'https://yournextmp.com/person/%s/update' % mp['id']
r = s.get(update_url, verify=False)
form_soup = BeautifulSoup(r.text).form
# faff about populating forms.
# Mechanize is preferable for this sort of thing.
payload = {x.attrs['name']: x.attrs.get('value', '') for x in form_soup.find_all('input') if 'name' in x.attrs}
for x in form_soup.find_all('select'):
selected = x.find('option', {'selected': 'selected'})
if selected is not None:
payload[x.attrs.get('name')] = selected.attrs.get('value', '')
else:
payload[x.attrs.get('name')] = ''
payload['twitter_username'] = mp['twitter']
payload['source'] = source
print 'Updating %s with @%s' % (update_url, mp['twitter'])
# Update!!!
r = s.post(update_url, data=payload, verify=False, headers={"Referer": update_url})

https://yournextmp.com/constituency/65801/ Cheryl Gillan MP (@CherylGillanMP) missing


https://yournextmp.com/constituency/65806/ Ian Austin (@IanAustinMP) missing


https://yournextmp.com/constituency/65807/ Keith Vaz MP (@Keith_VazMP) missing


https://yournextmp.com/constituency/65648/ Nadhim Zahawi (@nadhimzahawi) missing


https://yournextmp.com/constituency/65649/ Stewart Jackson MP (@SJacksonMP) missing


https://yournextmp.com/constituency/65875/ Robert Halfon MP (@halfon4harlowMP) missing


https://yournextmp.com/constituency/65653/ James Brokenshire (@JBrokenshire) missing


https://yournextmp.com/constituency/65652/ Elizabeth Truss (@trussliz) missing


https://yournextmp.com/constituency/65978/ Andy Burnham (@leighmp) missing


https://yournextmp.com/constituency/65979/ Greg Knight (@gregknightmp) missing


https://yournextmp.com/constituency/65974/ AlisonSeabeckMP (@alisonseabeck) missing


https://yournextmp.com/constituency/65975/ Ivan Lewis (@IvanLewis_MP) missing


https://yournextmp.com/constituency/65792/ Lindsay Hoyle MP (@LindsayHoyle_MP) missing


https://yournextmp.com/constituency/65971/ James Morris (@JamesMorrisMP) missing


https://yournextmp.com/constituency/65796/ Gareth Thomas MP (@GarethThomasMP) missing


https://yournextmp.com/constituency/65571/ Stephen McPartland (@SMcPartlandMP) missing


https://yournextmp.com/constituency/65573/ Stephen Timms (@stephenctimms) missing


https://yournextmp.com/constituency/65576/ Glenda Jackson (@glendajacksonmp) missing


https://yournextmp.com/constituency/65578/ Andrew Jones MP (@AndrewJonesMP) missing


https://yournextmp.com/constituency/65776/ Andrew Bridgen MP (@AndrewBridgenMP) missing


https://yournextmp.com/constituency/14454/ Anne McGuire MP (@AnneMcGuireMP) missing


https://yournextmp.com/constituency/14451/ Pete Wishart (@PeteWishart) missing


https://yournextmp.com/constituency/14450/ Douglas Alexander (@DAlexanderMP) missing


https://yournextmp.com/constituency/65778/ Edward Davey (@eddaveykands) missing


https://yournextmp.com/constituency/65779/ DamianCollins (@DamianCollins) missing


https://yournextmp.com/constituency/66131/ Mark Durkan (@markdurkan) missing


https://yournextmp.com/constituency/66134/ Conor Murphy (@conormurphymp) missing


https://yournextmp.com/constituency/14442/ Angus Robertson (@MorayMP) missing


https://yournextmp.com/constituency/66047/ Adrian Bailey (@Adrian_Bailey) missing


https://yournextmp.com/constituency/66046/ Michael Fabricant (@Mike_Fabricant) missing


https://yournextmp.com/constituency/66042/ Chuka Umunna (@ChukaUmunna) missing


https://yournextmp.com/constituency/66032/ Ian Swales (@iswales) missing


https://yournextmp.com/constituency/66033/ Ben Bradshaw (@BenPBradshaw) missing


https://yournextmp.com/constituency/65608/ Chris White MP (@ChrisWhite_MP) missing


https://yournextmp.com/constituency/65609/ margot james (@margotjamesmp) missing


https://yournextmp.com/constituency/65606/ Ann Coffey MP (@anncoffey_mp) missing


https://yournextmp.com/constituency/65607/ Therese Coffey (@theresecoffey) missing


https://yournextmp.com/constituency/65600/ Austin Mitchell (@AVMitchell2010) missing


https://yournextmp.com/constituency/65931/ Gisela (@GiselaStuart) missing


https://yournextmp.com/constituency/65936/ Helen Grant MP (@HelenGrantMP) missing


https://yournextmp.com/constituency/65938/ Mike Freer MP (@mikefreermp) missing


https://yournextmp.com/constituency/65830/ Peter Bone MP (@PeterBoneMP) missing


https://yournextmp.com/constituency/65833/ Alan Duncan (@AlanDuncanMP) missing


https://yournextmp.com/constituency/65733/ Mary Creagh MP (@marycreagh_mp) missing


https://yournextmp.com/constituency/65737/ Oliver Colvile MP (@olivercolvile) missing


https://yournextmp.com/constituency/65735/ Ed Balls (@edballsmp) missing


https://yournextmp.com/constituency/65947/ Bridget Phillipson (@bphillipsonMP) missing


https://yournextmp.com/constituency/65943/ Gavin Williamson MP (@GWilliamsonMP) missing


https://yournextmp.com/constituency/65942/ Kwasi Kwarteng (@kwasikwarteng) missing


https://yournextmp.com/constituency/65948/ Paul Uppal (@pauluppalmp) missing


https://yournextmp.com/constituency/65549/ Meg Munn (@MegMunn01) missing


https://yournextmp.com/constituency/14409/ Gregg McClymont MP (@greggmcclymont) missing


https://yournextmp.com/constituency/14405/ Michael Moore (@MichaelMooreMP) missing


https://yournextmp.com/constituency/14401/ Michael Weir (@mikeweirsnp) missing


https://yournextmp.com/constituency/66008/ Sir Tony Baldry MP (@TonyBaldry) missing


https://yournextmp.com/constituency/66000/ Andrew Percy (@andrewpercy) missing


https://yournextmp.com/constituency/66003/ Mark Prisk (@Mark_Prisk) missing


https://yournextmp.com/constituency/66005/ Crispin Blunt (@crispinbluntmp) missing


https://yournextmp.com/constituency/66004/ Peter Aldous MP (@peter_aldous) missing


https://yournextmp.com/constituency/66007/ Pauline Latham MP (@Pauline_Latham) missing


https://yournextmp.com/constituency/65888/ Peter Luff MP (@PeterJLuff) missing


https://yournextmp.com/constituency/65889/ John Glen (@JohnGlenMP) missing


https://yournextmp.com/constituency/65911/ Kate Green (@KateGreenSU) missing


https://yournextmp.com/constituency/65880/ Christopher Pincher (@ChrisPincher) missing


https://yournextmp.com/constituency/65881/ Christopher Huhne (@ChrisHuhne) missing


https://yournextmp.com/constituency/65798/ Don Foster (@DonFosterMP) missing


https://yournextmp.com/constituency/65643/ Graham Allen MP (@GrahamAllenMP) missing


https://yournextmp.com/constituency/65640/ Amber Rudd (@AmberRuddMP) missing


https://yournextmp.com/constituency/65862/ Richard Benyon (@RichardBenyonMP) missing


https://yournextmp.com/constituency/65644/ Luciana Berger (@lucianaberger) missing


https://yournextmp.com/constituency/65900/ Maria Eagle MP (@meaglemp) missing


https://yournextmp.com/constituency/65904/ Geoffrey Cox MP (@Geoffrey_Cox) missing


https://yournextmp.com/constituency/65907/ Karen Bradley (@karen__bradley) missing


https://yournextmp.com/constituency/65587/ Liz Kendall MP (@leicesterliz) missing


https://yournextmp.com/constituency/65656/ Mark Pawsey (@MarkPawsey) missing


https://yournextmp.com/constituency/65581/ Frank Field's Team (@frankfieldteam) missing


https://yournextmp.com/constituency/65582/ Jesse Norman (@Jesse_Norman) missing


https://yournextmp.com/constituency/65743/ Jessica Lee MP (@JessicaLeeMP) missing


https://yournextmp.com/constituency/65790/ Aidan Burley MP (@AidanBurleyMP) missing


https://yournextmp.com/constituency/65740/ Grant Shapps MP (@grantshapps) missing


https://yournextmp.com/constituency/65748/ Daniel Poulter (@DrDanPoulter) missing


https://yournextmp.com/constituency/66120/ Jonathan Evans MP (@JonathanEvansMP) missing


https://yournextmp.com/constituency/66126/ Alasdair McDonnell (@AMcDonnellMP) missing


https://yournextmp.com/constituency/66127/ Paul Maskey (@PaulMaskeyMP) missing


https://yournextmp.com/constituency/66125/ Nigel Dodds (@NigelDoddsMP) missing


https://yournextmp.com/constituency/14431/ Ian Davidson MP (@IanDavidsonMP) missing


https://yournextmp.com/constituency/14430/ Tom Harris (@TomHarrisMP) missing


https://yournextmp.com/constituency/14433/ Malcolm Bruce (@malcolmbruce) missing


https://yournextmp.com/constituency/66057/ Martin Vickers (@martinvickersmp) missing


https://yournextmp.com/constituency/66052/ Andrew Bingham MP (@HighPeakAndrew) missing


https://yournextmp.com/constituency/66059/ Michael Ellis (@Michael_Ellis1) missing


https://yournextmp.com/constituency/65662/ Margaret Hodge MP (@margarethodge) missing


https://yournextmp.com/constituency/65843/ Simon Danczuk (@SimonDanczuk) missing


https://yournextmp.com/constituency/65638/ Ed Vaizey (@edvaizey) missing


https://yournextmp.com/constituency/65770/ Rob Flello MP (@RobFlelloMP) missing


https://yournextmp.com/constituency/65633/ David Morris MP (@MPDavidMorris) missing


https://yournextmp.com/constituency/65632/ MarkSpencerMP (@MarkSpencerMP) missing


https://yournextmp.com/constituency/65637/ Stuart Andrew MP (@StuartAndrew) missing


https://yournextmp.com/constituency/65636/ Bob Ainsworth (@BobAinsworthMP) missing


https://yournextmp.com/constituency/65635/ Angela Eagle (@angelaeagle) missing


https://yournextmp.com/constituency/65829/ Laura Sandys MP (@Laura_Sandys) missing


https://yournextmp.com/constituency/65822/ James Gray MP (@JamesGrayMP) missing


https://yournextmp.com/constituency/65823/ Grahame Morris (@grahamemorris) missing


https://yournextmp.com/constituency/65820/ Helen Goodman (@HelenGoodmanMP) missing


https://yournextmp.com/constituency/65827/ Stephen Hammond MP (@SHammondMP) missing


https://yournextmp.com/constituency/65707/ John Hemming (@johnhemmingmp) missing


https://yournextmp.com/constituency/65706/ Bill Esterson (@BillEstersonMP) missing


https://yournextmp.com/constituency/65705/ Heidi Alexander (@heidi_mp) missing


https://yournextmp.com/constituency/65704/ Karl McCartney (@karlmccartney) missing


https://yournextmp.com/constituency/65708/ Andrew Griffiths MP (@agriffithsmp) missing


https://yournextmp.com/constituency/65956/ andrew murrison (@murrisonMP) missing


https://yournextmp.com/constituency/65952/ Edward Leigh (@edwardleighac) missing


https://yournextmp.com/constituency/65958/ Mary Macleod (@MaryMacleod4MP) missing


https://yournextmp.com/constituency/65559/ Chris Leslie (@ChrisLeslieMP) missing


https://yournextmp.com/constituency/65553/ Caroline Flint (@CarolineFlintMP) missing


https://yournextmp.com/constituency/65551/ Vernon Coaker (@Vernon_CoakerMP) missing


https://yournextmp.com/constituency/65688/ Hazel Blears (@HazelBlearsMP) missing


https://yournextmp.com/constituency/66019/ Jake Berry (@JakeBerryMP) missing


https://yournextmp.com/constituency/66010/ Steve Baker MP (@SteveBakerMP) missing


https://yournextmp.com/constituency/66016/ John Denham (@JohnDenhamMP) missing


https://yournextmp.com/constituency/66081/ Rory Stewart (@RoryStewartUK) missing


https://yournextmp.com/constituency/66080/ Gavin Shuker (@gavinshuker) missing


https://yournextmp.com/constituency/66082/ Peter Hain (@PeterHain) missing


https://yournextmp.com/constituency/66087/ Owen Smith MP (@OwenSmithMP) missing


https://yournextmp.com/constituency/66089/ Jonathan Edwards (@JonathanPlaid) missing


https://yournextmp.com/constituency/65985/ Jon Cruddas (@JonCruddasMP) missing


https://yournextmp.com/constituency/65986/ Julian Smith MP (@JulianSmithMP) missing


https://yournextmp.com/constituency/65988/ Rachel Reeves (@RachelReevesMP) missing


https://yournextmp.com/constituency/65853/ Rushanara Ali (@rushanaraali) missing


https://yournextmp.com/constituency/65851/ Karen Buck (@KarenBuckMP) missing


https://yournextmp.com/constituency/65677/ Alec Shelbrooke (@AlecShelbrooke) missing


https://yournextmp.com/constituency/65859/ Pat Glass (@PatGlassMP) missing


https://yournextmp.com/constituency/65906/ Craig Whittaker (@Craig_Whittaker) missing


https://yournextmp.com/constituency/65670/ Brooks Newmark MP (@TweetBrooks) missing


https://yournextmp.com/constituency/65598/ Zac Goldsmith (@ZacGoldsmith) missing


https://yournextmp.com/constituency/65597/ Steve McCabe (@steve_mccabe) missing


https://yournextmp.com/constituency/65595/ Barry Gardiner MP (@BarryGardiner) missing


https://yournextmp.com/constituency/65592/ Jonathan Djanogly (@JDjanogly) missing


https://yournextmp.com/constituency/65593/ Pat McFadden (@patmcfaddenmp) missing


https://yournextmp.com/constituency/65697/ Dr Phillip Lee MP (@DrPhillipLeeMP) missing


https://yournextmp.com/constituency/65691/ Mike Weatherley MP (@mike_weatherley) missing


https://yournextmp.com/constituency/65755/ Angie Bray (@AngieBray2015) missing


https://yournextmp.com/constituency/65757/ Barbara Keeley (@KeeleyMP) missing


https://yournextmp.com/constituency/65750/ paulcmaynard (@PaulMaynardMP) missing


https://yournextmp.com/constituency/14426/ Margaret Curran (@Margaret_Curran) missing


https://yournextmp.com/constituency/14424/ Eric Joyce MP (@ericjoyce) missing


https://yournextmp.com/constituency/14425/ AnasSarwar (@AnasSarwar) missing


https://yournextmp.com/constituency/14420/ Mark Lazarowicz (@marklazarowicz) missing


https://yournextmp.com/constituency/14428/ William Bain (@William_Bain) missing


https://yournextmp.com/constituency/14429/ John Robertson (@JohnRobertsonMP) missing


https://yournextmp.com/constituency/66063/ Steve Barclay (@SteveBarclayMP) missing


https://yournextmp.com/constituency/66061/ Annette Brooke (@Annette4MDNP) missing


https://yournextmp.com/constituency/66067/ Jeremy Lefroy (@JeremyLefroyMP) missing


https://yournextmp.com/constituency/66064/ Mark Harper (@Mark_J_Harper) missing


https://yournextmp.com/constituency/66117/ Nia Griffith (@NiaGriffithMP) missing


https://yournextmp.com/constituency/66116/ Chris Ruane MP (@ChrisRuaneMP) missing


https://yournextmp.com/constituency/66114/ Kevin Brennan (@KevinBrennanMP) missing


https://yournextmp.com/constituency/66112/ David Hanson (@DavidHansonMP) missing


https://yournextmp.com/constituency/66111/ Glyn Davies (@GlynDaviesMP) missing


https://yournextmp.com/constituency/66118/ Geraint Davies MP (@GeraintDaviesMP) missing


https://yournextmp.com/constituency/65678/ Jeremy Hunt (@Jeremy_Hunt) missing


https://yournextmp.com/constituency/65817/ Dr Liam Fox MP (@LiamFoxMP) missing


https://yournextmp.com/constituency/65816/ Clive Efford (@CliveEfford) missing


https://yournextmp.com/constituency/65674/ Douglas Carswell MP (@DouglasCarswell) missing


https://yournextmp.com/constituency/65813/ Hugo Swire (@HugoSwire) missing


https://yournextmp.com/constituency/65812/ About David Heath MP (@DavidHeathMP) missing


https://yournextmp.com/constituency/65672/ Ed Miliband (@Ed_Miliband) missing


https://yournextmp.com/constituency/65711/ John Mann (@JohnMannOffice) missing


https://yournextmp.com/constituency/65712/ Yasmin Qureshi (@YasminQureshiMP) missing


https://yournextmp.com/constituency/65719/ David Miliband (@DMiliband) missing


https://yournextmp.com/constituency/65651/ stellacreasy (@stellacreasy) missing


https://yournextmp.com/constituency/65624/ Barry Sheerman MP (@BarrySheerman) missing


https://yournextmp.com/constituency/65626/ Richard Harrington (@Richard4Watford) missing


https://yournextmp.com/constituency/65966/ Richard Burden MP (@RichardBurdenMP) missing


https://yournextmp.com/constituency/65623/ Maria_MillerMP (@Maria_MillerMP) missing


https://yournextmp.com/constituency/65969/ Mark Simmonds MP (@MarkJSimmonds) missing


https://yournextmp.com/constituency/65784/ Nick Herbert (@nickherbertmp) missing


https://yournextmp.com/constituency/65629/ Matthew Hancock (@matthancockmp) missing


https://yournextmp.com/constituency/65780/ Tim Loughton MP (@timloughton) missing


https://yournextmp.com/constituency/65765/ Hilary Benn MP (@hilarybennmp) missing


https://yournextmp.com/constituency/65766/ Stephen Twigg (@StephenTwigg) missing


https://yournextmp.com/constituency/65760/ Justin Tomlinson MP (@JTomlinsonMP) missing


https://yournextmp.com/constituency/65762/ Heather Wheeler (@HeatherWheeler) missing


https://yournextmp.com/constituency/65769/ Graham Evans MP (@GrahamEvans) missing


https://yournextmp.com/constituency/65758/ Harriett Baldwin (@HBaldwinMP) missing


https://yournextmp.com/constituency/66092/ Chris Bryant (@ChrisBryantMP) missing


https://yournextmp.com/constituency/66098/ Alun Cairns (@AlunCairns) missing


https://yournextmp.com/constituency/66099/ Paul Flynn (@PaulFlynnMP) missing


https://yournextmp.com/constituency/65992/ David Wright MP (@DavidWrightMP) missing


https://yournextmp.com/constituency/65993/ Tobias Ellwood (@TobiasEllwoodMP) missing


https://yournextmp.com/constituency/65990/ Iain Wright (@IainWrightMP) missing


https://yournextmp.com/constituency/65991/ Andrew Miller MP (@APMiller1949) missing


https://yournextmp.com/constituency/65995/ Gerry Sutcliffe (@GSutcliffeMP) missing


https://yournextmp.com/constituency/65657/ Tom Blenkinsop (@TomBlenkinsop) missing


https://yournextmp.com/constituency/66027/ Nic Dakin MP (@NicDakinMP) missing


https://yournextmp.com/constituency/66025/ Chris Heaton-Harris (@chhcalling) missing


https://yournextmp.com/constituency/66024/ Dan Byles MP (@danielbyles) missing


https://yournextmp.com/constituency/66022/ Michael Meacher (@michaelmeacher) missing


https://yournextmp.com/constituency/66029/ Denis MacShane (@DenisMacShane) missing


https://yournextmp.com/constituency/65618/ Diana Johnson (@DianaJohnsonMP) missing


https://yournextmp.com/constituency/65610/ Gordon Henderson (@ghendersonmp) missing


https://yournextmp.com/constituency/65794/ Virendra Sharma MP (@VirendraSharma) missing


https://yournextmp.com/constituency/65925/ Ben Gummer (@ben4ipswich) missing


https://yournextmp.com/constituency/65921/ Steve Brine (@sbrine) missing


https://yournextmp.com/constituency/65929/ John Stevenson MP (@JohnStevensonMP) missing


https://yournextmp.com/constituency/65928/ caroline dinenage mp (@cj_dinenage) missing


https://yournextmp.com/constituency/65668/ Andrew Stephenson MP (@Andrew4Pendle) missing


https://yournextmp.com/constituency/65849/ Anna Soubry MP (@Anna_SoubryMP) missing


https://yournextmp.com/constituency/65660/ Greg Clark (@gregclarkmp) missing


https://yournextmp.com/constituency/65845/ Greg Barker (@GregBarkerMP) missing


https://yournextmp.com/constituency/65847/ Alison McGovern (@Alison_McGovern) missing


https://yournextmp.com/constituency/65842/ Nigel Adams (@nigel4selby) missing


https://yournextmp.com/constituency/65685/ Eric Pickles (@EricPickles) missing


https://yournextmp.com/constituency/65680/ fiona mactaggart (@fionamacmp) missing


https://yournextmp.com/constituency/65723/ Claire Perry (@claire4devizes) missing


https://yournextmp.com/constituency/65722/ William Hague (@WilliamJHague) missing


https://yournextmp.com/constituency/65689/ Simon Hughes (@SimonHughesMP) missing


https://yournextmp.com/constituency/14446/ Ming Campbell (@MingCampbellMP) missing


https://yournextmp.com/constituency/14413/ Jim McGovern (@JimMcGovernMP) missing


https://yournextmp.com/constituency/14411/ David Mundell MP (@DavidMundellMP) missing


https://yournextmp.com/constituency/14410/ Russell Brown (@russellbrownmp) missing


https://yournextmp.com/constituency/14417/ Fiona O'Donnell MP (@FionaODonnellMP) missing


https://yournextmp.com/constituency/14414/ Thomas Docherty MP (@Thomas_Docherty) missing


https://yournextmp.com/constituency/14419/ Sheila Gilmore (@SheilaGilmoreMP) missing


https://yournextmp.com/constituency/14418/ Jim Murphy (@jimmurphymp) missing


https://yournextmp.com/constituency/66078/ Mark Garnier (@Mark4WyreForest) missing


https://yournextmp.com/constituency/66079/ john spellar (@spellar) missing


https://yournextmp.com/constituency/66075/ Tracey Crouch (@tracey_crouch) missing


https://yournextmp.com/constituency/66076/ Iain Stewart MP (@iainastewart) missing


https://yournextmp.com/constituency/66077/ Andrew Rosindell MP (@AndrewRosindell) missing


https://yournextmp.com/constituency/65899/ Graham Jones (@GrahamJones_MP) missing


https://yournextmp.com/constituency/65897/ Esther McVey (@EstherMcVeyMP) missing


https://yournextmp.com/constituency/65896/ David Rutley (@DavidRutleyMP) missing


https://yournextmp.com/constituency/65895/ Gloria De Piero (@GloriaDePiero) missing


https://yournextmp.com/constituency/65893/ Jamie Reed (@jreedmp) missing


https://yournextmp.com/constituency/66100/ David Jones (@DavidJonesMP) missing


https://yournextmp.com/constituency/66102/ Stephen Crabb MP (@SCrabbMP) missing


https://yournextmp.com/constituency/66108/ Hywel Williams (@HywelWilliamsMP) missing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment