import mechanize import cookielib from bs4 import BeautifulSoup as BS import datetime import sys from operator import itemgetter   br = mechanize.Browser() cj = cookielib.LWPCookieJar() br.set_cookiejar(cj) br.set_handle_robots(False) br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:24.0) Gecko/20140610 Firefox/24.0 PaleMoon/24.6.2')]   def techlevels(alliance):     advanced = persian = almost = vietnam = korean = second = first = finest = stone = 0     for i in alliance:         if i['equipment'].rstrip() == 'Advanced':             advanced += 1         elif i['equipment'].rstrip() == 'Persian Gulf War surplus':             persian += 1         elif i['equipment'].rstrip() == 'Almost Modern':             almost += 1         elif i['equipment'].rstrip() == 'Vietnam War surplus':             vietnam += 1         elif i['equipment'].rstrip() == 'Korean War surplus':             korean += 1         elif i['equipment'].rstrip() == 'Second World War surplus':             second += 1         elif i['equipment'].rstrip() == 'First World War surplus':             first += 1         elif i['equipment'].rstrip() == 'Finest of the 19th century':             finest += 1         else:             stone += 1     return advanced, persian, almost, vietnam, korean, second, first, finest, stone   def airforcelevels(alliance):     vpowerful = powerful = large = somelarge = mediocre = meagre = small = none = 0     for i in alliance:         if i['airforce'].rstrip() == 'Very Powerful':             vpowerful += 1         elif i['airforce'].rstrip() == 'Powerful':             powerful += 1         elif i['airforce'].rstrip() == 'Large':             large += 1         elif i['airforce'].rstrip() == 'Somewhat Large':             somelarge += 1         elif i['airforce'].rstrip() == 'Mediocre':             mediocre += 1         elif i['airforce'].rstrip() == 'Meagre':             meagre += 1         elif i['airforce'].rstrip() == 'Small':             small += 1         else:             none += 1     return vpowerful, powerful, large, somelarge, mediocre, meagre, small, none   def traininglevels(alliance):     elite = good = standard = poor = rabble = 0     for i in alliance:         if i['training'].rstrip() == 'Elite':             elite += 1         elif i['training'].rstrip() == 'Good':             good += 1         elif i['training'].rstrip() == 'Standard':             standard += 1         elif i['training'].rstrip() == 'Poor':             poor += 1         else:             rabble += 1     return elite, good, standard, poor, rabble   def regionlevels(alliance):     mam = car = gra = ama = sco = saf = con = eaf = gui = waf = atl = egy = ara = mpo = per = sub = chi = ind = ein = pac = 0     for i in alliance:         if i['region'].rstrip() == 'Mesoamerica':             mam += 1         elif i['region'].rstrip() == 'Caribbean':             car += 1         elif i['region'].rstrip() == 'Gran Colombia':             gra += 1         elif i['region'].rstrip() == 'Amazonia':             ama += 1         elif i['region'].rstrip() == 'Southern Cone':             sco += 1         elif i['region'].rstrip() == 'Southern Africa':             saf += 1         elif i['region'].rstrip() == 'Congo':             con += 1         elif i['region'].rstrip() == 'East Africa':             eaf += 1         elif i['region'].rstrip() == 'Guinea':             gui += 1         elif i['region'].rstrip() == 'West Africa':             waf += 1         elif i['region'].rstrip() == 'Atlas':             atl += 1         elif i['region'].rstrip() == 'Egypt':             egy += 1         elif i['region'].rstrip() == 'Arabia':             ara += 1         elif i['region'].rstrip() == 'Mesopotamia':             mpo += 1         elif i['region'].rstrip() == 'Persia':             per += 1         elif i['region'].rstrip() == 'The Subcontinent':             sub += 1         elif i['region'].rstrip() == 'China':             chi += 1         elif i['region'].rstrip() == 'Indochina':             ind += 1         elif i['region'].rstrip() == 'East Indies':             ein += 1         elif i['region'].rstrip() == 'Pacific Rim':             pac += 1     return mam, car, gra, ama, sco, saf, con, eaf, gui, waf, atl, egy, ara, mpo, per, sub, chi, ind, ein, pac   def manpowerlevels(alliance):     untapped = plentiful = halved = low = neardep = depleted = 0     for i in alliance:         if i['manpower'].rstrip() == 'Untapped':             untapped += 1         elif i['manpower'].rstrip() == 'Plentiful':             plentiful += 1         elif i['manpower'].rstrip() == 'Halved':             halved += 1         elif i['manpower'].rstrip() == 'Low':             low += 1         elif i['manpower'].rstrip() == 'Near Depletion':             neardep += 1         elif i['manpower'].rstrip() == 'Depleted':             depleted += 1     return untapped, plentiful, halved, low, neardep, depleted   def approvallevels(alliance):     waag = adored = loved = liked = decent = middling = disliked = hated = despised = eop = 0     for i in alliance:         if i['approval'].rstrip() == 'Worshiped as a God':             waag += 1         elif i['approval'].rstrip() == 'Adored':             adored += 1         elif i['approval'].rstrip() == 'Loved':             loved += 1         elif i['approval'].rstrip() == 'Liked':             liked += 1         elif i['approval'].rstrip() == 'Decent':             decent += 1         elif i['approval'].rstrip() == 'Middling':             middling += 1         elif i['approval'].rstrip() == 'Disliked':             disliked += 1         elif i['approval'].rstrip() == 'Hated':             hated += 1         elif i['approval'].rstrip() == 'Utterly Despised':             despised += 1         elif i['approval'].rstrip() == 'Enemy of the People':             eop += 1     return waag, adored, loved, liked, decent, middling, disliked, hated, despised, eop   def polsystemlevels(alliance):     libdem = authdem = opr = junta = dictat = 0     for i in alliance:         if i['polsystem'].rstrip() == 'Liberal Democracy':             libdem += 1         elif i['polsystem'].rstrip() == 'Authoritarian Democracy':             authdem += 1         elif i['polsystem'].rstrip() == 'One Party Rule':             opr += 1         elif i['polsystem'].rstrip() == 'Military Junta':             junta += 1         elif i['polsystem'].rstrip() == 'Dictatorship':             dictat += 1     return libdem, authdem, opr, junta, dictat   def stabilitylevels(alliance):     unsink = entrenched = vstable = quiet = calm = tensions = chaotic = rioting = protests = collapse = 0     for i in alliance:         if i['stability'].rstrip() == 'Unsinkable':             unsink += 1         elif i['stability'].rstrip() == 'Entrenched':             entrenched += 1         elif i['stability'].rstrip() == 'Very Stable':             vstable += 1         elif i['stability'].rstrip() == 'Quiet':             quiet += 1         elif i['stability'].rstrip() == 'Seemingly Calm':             calm += 1         elif i['stability'].rstrip() == 'Growing Tensions':             tensions += 1         elif i['stability'].rstrip() == 'Chaotic':             chaotic += 1         elif i['stability'].rstrip() == 'Rioting':             rioting += 1         elif i['stability'].rstrip() == 'Mass Protests':             protests += 1         elif i['stability'].rstrip() == 'Brink of Collapse':             collapse += 1     return unsink, entrenched, vstable, quiet, calm, tensions, chaotic, rioting, protests, collapse   def rebelslevels(alliance):     norebels = terror = guerrilla = rebellion = civil = 0     for i in alliance:         if i['rebels'].rstrip() == 'None':             norebels += 1         elif i['rebels'].rstrip() == 'Scattered terrorists':             terror += 1         elif i['rebels'].rstrip() == 'Guerrillas':             guerrilla += 1         elif i['rebels'].rstrip() == 'Open Rebellion':             rebellion += 1         elif i['rebels'].rstrip() == 'Civil War':             civil += 1     return norebels, terror, guerrilla, rebellion, civil   def econsystemlevels(alliance):     free = mixed = command = 0     for i in alliance:         if i['econsystem'].rstrip() == 'Free Market':             free += 1         elif i['econsystem'].rstrip() == 'Mixed Economy':             mixed += 1         elif i['econsystem'].rstrip() == 'Central Planning':             command += 1     return free, mixed, command   def qollevels(alliance):     developed = good = decent = above = average = poor = impov = desp = disast = crisis = 0     for i in alliance:         if i['qol'].rstrip() == 'Developed':             developed += 1         elif i['qol'].rstrip() == 'Good':             good += 1         elif i['qol'].rstrip() == 'Decent':             decent += 1         elif i['qol'].rstrip() == 'Above Average':             above += 1         elif i['qol'].rstrip() == 'Average':             average += 1         elif i['qol'].rstrip() == 'Poor':             poor += 1         elif i['qol'].rstrip() == 'Impoverished':             impov += 1         elif i['qol'].rstrip() == 'Desperate':             desp += 1         elif i['qol'].rstrip() == 'Disastrous':             disast += 1         else:             crisis += 1     return developed, good, decent, above, average, poor, impov, desp, disast, crisis   def alignlevels(alliance):     west = non = east = 0     for i in alliance:         if i['alignment'].rstrip() == 'United States':             west += 1         elif i['alignment'].rstrip() == 'Neutral':             non += 1         elif i['alignment'].rstrip() == 'Soviet Union':             east += 1     return west, non, east   def replevels(alliance):     gandhi = angelic = nice = good = normal = quest = isolated = pariah = maddog = aoe = 0     for i in alliance:         if i['reputation'].rstrip() == 'Gandhi-like':             gandhi += 1         elif i['reputation'].rstrip() == 'Angelic':             angelic += 1         elif i['reputation'].rstrip() == 'Nice':             nice += 1         elif i['reputation'].rstrip() == 'Good':             good += 1         elif i['reputation'].rstrip() == 'Normal':             normal += 1         elif i['reputation'].rstrip() == 'Questionable':             quest += 1         elif i['reputation'].rstrip() == 'Isolated':             isolated += 1         elif i['reputation'].rstrip() == 'Pariah':             pariah += 1         elif i['reputation'].rstrip() == 'Mad Dog':             maddog += 1         elif i['reputation'].rstrip() == 'Axis of Evil':             aoe += 1     return gandhi, angelic, nice, good, normal, quest, isolated, pariah, maddog, aoe   def regiontroops(alliance):     mam = car = gra = ama = sco = saf = con = eaf = gui = waf = atl = egy = ara = mpo = per = sub = chi = ind = ein = pac = 0     for i in alliance:         if i['region'].rstrip() == 'Mesoamerica':             mam += i['troops']         elif i['region'].rstrip() == 'Caribbean':             car += i['troops']         elif i['region'].rstrip() == 'Gran Colombia':             gra += i['troops']         elif i['region'].rstrip() == 'Amazonia':             ama += i['troops']         elif i['region'].rstrip() == 'Southern Cone':             sco += i['troops']         elif i['region'].rstrip() == 'Southern Africa':             saf += i['troops']         elif i['region'].rstrip() == 'Congo':             con += i['troops']         elif i['region'].rstrip() == 'East Africa':             eaf += i['troops']         elif i['region'].rstrip() == 'Guinea':             gui += i['troops']         elif i['region'].rstrip() == 'West Africa':             waf += i['troops']         elif i['region'].rstrip() == 'Atlas':             atl += i['troops']         elif i['region'].rstrip() == 'Egypt':             egy += i['troops']         elif i['region'].rstrip() == 'Arabia':             ara += i['troops']         elif i['region'].rstrip() == 'Mesopotamia':             mpo += i['troops']         elif i['region'].rstrip() == 'Persia':             per += i['troops']         elif i['region'].rstrip() == 'The Subcontinent':             sub += i['troops']         elif i['region'].rstrip() == 'China':             chi += i['troops']         elif i['region'].rstrip() == 'Indochina':             ind += i['troops']         elif i['region'].rstrip() == 'East Indies':             ein += i['troops']         elif i['region'].rstrip() == 'Pacific Rim':             pac += i['troops']     return mam, car, gra, ama, sco, saf, con, eaf, gui, waf, atl, egy, ara, mpo, per, sub, chi, ind, ein, pac   def getsoup(url):     while True:         try:             temp = br.open(url)         except:             print "Timeout, requesting again."         else:             break     html = temp.read()     soup = BS(html)     # print soup.prettify()     return soup   def getdata(soup):     data = {}     if soup.find(size="2").string == 'online now':         data['online'] = 0     else:         data['online'] = int(soup.find(size="2").string[12:-10])     data['name'] = soup.find(id="nationtitle").string     data['approval'] = soup.find(text='Approval:').parent.next_sibling.next_sibling.contents[0].string     data['polsystem'] = soup.find(text='Political System:').parent.next_sibling.next_sibling.contents[0].string     data['stability'] = soup.find(text='Stability:').parent.next_sibling.next_sibling.contents[0].string     data['qol'] = soup.find(text='Quality of Life:').parent.next_sibling.next_sibling.contents[0].string     data['territory'] = int(str(soup.find(text='Territory:').parent.next_sibling.next_sibling.contents)[4:-20])     data['rebels'] = soup.find(text='Rebel Threat:').parent.next_sibling.next_sibling.contents[0].string     data['econsystem'] = soup.find(text='Economic System:').parent.next_sibling.next_sibling.contents[0].string     if soup.find(text='Industry:').parent.next_sibling.next_sibling.contents[0].string == 'None':         data['factories'] = 0     elif soup.find(text='Industry:').parent.next_sibling.next_sibling.contents[0].string == '1 factory':         data['factories'] = 1     else:         data['factories'] = int(soup.find(text='Industry:').parent.next_sibling.next_sibling.contents[0].string[:-10])     data['gdp'] = int(soup.find(text='Gross Domestic Product:').parent.next_sibling.next_sibling.contents[0].string[1:-8])     data['growth'] = int(soup.find(text='Growth:').parent.next_sibling.next_sibling.contents[0].string[1:-18])     if soup.find(text='Discovered Oil Reserves:').parent.next_sibling.next_sibling.contents[0].string == 'None':         data['oilres'] = 0     else:         data['oilres'] = int(soup.find(text='Discovered Oil Reserves:').parent.next_sibling.next_sibling.contents[0].string[:-5])     if soup.find(text='Oil Production:').parent.next_sibling.next_sibling.contents[0].string == 'None':         data['oilprod'] = 0     else:         data['oilprod'] = int(soup.find(text='Oil Production:').parent.next_sibling.next_sibling.contents[0].string[:-15])     try:         data['rmprod'] = int(soup.find(text='Raw Material Production:').parent.next_sibling.next_sibling.contents[0].string[:-23])     except:         print "rm" + soup.find(text='Raw Material Production:').parent.next_sibling.next_sibling.contents[0].string     data['alignment'] = soup.find(text='Official Alignment:').parent.next_sibling.next_sibling.contents[0].string     data['region'] = soup.find(text='Region:').parent.next_sibling.next_sibling.contents[0].string     data['reputation'] = soup.find(text='Reputation:').parent.next_sibling.next_sibling.contents[0].string     try:         data['troops'] = int(soup.find(text='Army Size:').parent.next_sibling.next_sibling.contents[0].string[:-18])     except:         print 'tr' + soup.find(text='Army Size:').parent.next_sibling.next_sibling.contents[0].string     data['manpower'] = soup.find(text='Manpower:').parent.next_sibling.next_sibling.contents[0].string     data['equipment'] = soup.find(text='Equipment:').parent.next_sibling.next_sibling.contents[0].string     data['training'] = soup.find(text='Training:').parent.next_sibling.next_sibling.contents[0].string     data['airforce'] = soup.find(text='Airforce:').parent.next_sibling.next_sibling.contents[0].string     if soup.find(text='Wars:').parent.next_sibling.next_sibling.contents[0].string == 'At peace.':         data['wars'] = 'peace'     else:         data['wars'] = 'war'     if soup.find(text='Uranium:') == None:         data['uranium'] = 0     else:         data['uranium'] = int(soup.find(text='Uranium:').parent.next_sibling.next_sibling.contents[0].string[:-5])     return data   def process(data):     generaldata = []     troopdata = []     for alliance in data:         datad = {}         troopd = {}         gdp = growth = troops = factories = territory = rmprod = oilprod = oilres = uranium = inactive = 0         for nation in alliance:             gdp += nation['gdp']             growth += nation['growth']             troops += nation['troops']             factories += nation['factories']             territory += nation['territory']             rmprod += nation['rmprod']             oilprod += nation['oilprod']             oilres += nation['oilres']             uranium += nation['uranium']             inactive += nation['online']           datad['size'] = len(alliance)         datad['gdp'] = gdp         datad['avggdp'] = round(gdp/float(len(alliance)), 1)         datad['growth'] = growth         datad['avggrowth'] = round(growth/float(len(alliance)), 1)         datad['factories'] = factories         datad['avgfactories'] = round(factories/float(len(alliance)), 1)         datad['territory'] = territory         datad['avgterritory'] = round(territory/float(len(alliance)), 1)         datad['rmprod'] = rmprod         datad['avgrmprod'] = round(rmprod/float(len(alliance)), 1)         datad['oilprod'] = oilprod         datad['avgoilprod'] = round(oilprod/float(len(alliance)), 1)         datad['oilres'] = oilres         datad['avgoilres'] = round(oilres/float(len(alliance)), 1)         datad['inactive'] = inactive         datad['avginactive'] = round(inactive/float(len(alliance)), 1)         datad['uranium'] = uranium           datad['advanced'], datad['persian'], datad['almost'], datad['vietnam'], datad['korean'], datad['second'], \             datad['first'], datad['finest'], datad['stone'] = techlevels(alliance)           datad['vpowerful'], datad['powerful'], datad['large'], datad['somelarge'], datad['mediocre'], datad['meagre'], \             datad['small'], datad['noair'] = airforcelevels(alliance)           datad['elite'], datad['good'], datad['standard'], datad['poortr'], datad['rabble'] = traininglevels(alliance)           datad['mam'], datad['car'], datad['gra'], datad['ama'], datad['sco'], datad['saf'], datad['con'], datad['eaf'], \             datad['gui'], datad['waf'], datad['atl'], datad['egy'], datad['ara'], datad['mpo'], datad['per'], datad['sub'], \             datad['chi'], datad['ind'], datad['ein'], datad['pac'] = regionlevels(alliance)           datad['untapped'], datad['plentiful'], datad['halved'], datad['low'], datad['neardep'], datad['depleted'] = manpowerlevels(alliance)           datad['waag'], datad['adored'], datad['loved'], datad['liked'], datad['decent'], datad['middling'], datad['disliked'], \             datad['hated'], datad['despised'], datad['eop'] = approvallevels(alliance)           datad['libdem'], datad['authdem'], datad['opr'], datad['junta'], datad['dictat'] = polsystemlevels(alliance)           datad['unsink'], datad['entren'], datad['vstable'], datad['quiet'], datad['calm'], datad['tensions'], datad['chaotic'], \             datad['rioting'], datad['protests'], datad['collapse'] = stabilitylevels(alliance)           datad['norebels'], datad['terror'], datad['guerrilla'], datad['rebellion'], datad['civil'] = rebelslevels(alliance)           datad['free'], datad['mixed'], datad['command'] = econsystemlevels(alliance)           datad['developed'], datad['good'], datad['decent'], datad['above'], datad['average'], datad['poorqol'], datad['impov'], \             datad['desp'], datad['disast'], datad['crisis'] = qollevels(alliance)           datad['west'], datad['non'], datad['east'] = alignlevels(alliance)           datad['gandhi'], datad['angelic'], datad['nice'], datad['good'], datad['normal'], datad['quest'], datad['isolated'], \             datad['pariah'], datad['maddog'], datad['aoe'] = replevels(alliance)           troopd['troops'] = troops         troopd['avgtroops'] = round(troops/float(len(alliance)), 1)           troopd['mam'], troopd['car'], troopd['gra'], troopd['ama'], troopd['sco'], troopd['saf'], troopd['con'], troopd['eaf'], \             troopd['gui'], troopd['waf'], troopd['atl'], troopd['egy'], troopd['ara'], troopd['mpo'], troopd['per'], troopd['sub'], \             troopd['chi'], troopd['ind'], troopd['ein'], troopd['pac'] = regiontroops(alliance)           generaldata.append(datad)         troopdata.append(troopd)       return generaldata, troopdata, uraniumlist   def difference(newdata, newtroopdata, prevdata, prevtroopdata):     datad = {}     troopd = {}       datad['size'] = newdata['size'] - prevdata['size']     datad['gdp'] = newdata['gdp'] - prevdata['gdp']     datad['avggdp'] = newdata['avggdp'] - prevdata['avggdp']     datad['growth'] = newdata['growth'] - prevdata['growth']     datad['avggrowth'] = newdata['avggrowth'] - prevdata['avggrowth']     datad['factories'] = newdata['factories'] - prevdata['factories']     datad['avgfactories'] = newdata['avgfactories'] - prevdata['avgfactories']     datad['territory'] = newdata['territory'] - prevdata['territory']     datad['avgterritory'] = newdata['avgterritory'] - prevdata['avgterritory']     datad['rmprod'] = newdata['rmprod'] - prevdata['rmprod']     datad['avgrmprod'] = newdata['avgrmprod'] - prevdata['avgrmprod']     datad['oilprod'] = newdata['oilprod'] - prevdata['oilprod']     datad['avgoilprod'] = newdata['avgoilprod'] - prevdata['avgoilprod']     datad['oilres'] = newdata['oilres'] - prevdata['oilres']     datad['avgoilres'] = newdata['avgoilres'] - prevdata['avgoilres']     datad['inactive'] = newdata['inactive'] - prevdata['inactive']     datad['avginactive'] = newdata['avginactive'] - prevdata['avginactive']     datad['uranium'] = newdata['uranium'] - prevdata['uranium']       datad['advanced'] = newdata['advanced'] - prevdata['advanced']     datad['persian'] = newdata['persian'] - prevdata['persian']     datad['almost'] = newdata['almost'] - prevdata['almost']     datad['vietnam'] = newdata['vietnam'] - prevdata['vietnam']     datad['korean'] = newdata['korean'] - prevdata['korean']     datad['second'] = newdata['second'] - prevdata['second']     datad['first'] = newdata['first'] - prevdata['first']     datad['finest'] = newdata['finest'] - prevdata['finest']     datad['stone'] = newdata['stone'] - prevdata['stone']       datad['vpowerful'] = newdata['vpowerful'] - prevdata['vpowerful']     datad['powerful'] = newdata['powerful'] - prevdata['powerful']     datad['large'] = newdata['large'] - prevdata['large']     datad['somelarge'] = newdata['somelarge'] - prevdata['somelarge']     datad['mediocre'] = newdata['mediocre'] - prevdata['mediocre']     datad['meagre'] = newdata['meagre'] - prevdata['meagre']     datad['small'] = newdata['small'] - prevdata['small']     datad['noair'] = newdata['noair'] - prevdata['noair']       datad['elite'] = newdata['elite'] - prevdata['elite']     datad['good'] = newdata['good'] - prevdata['good']     datad['standard'] = newdata['standard'] - prevdata['standard']     datad['poortr'] = newdata['poortr'] - prevdata['poortr']     datad['rabble'] = newdata['rabble'] - prevdata['rabble']       datad['mam'] = newdata['mam'] - prevdata['mam']     datad['car'] = newdata['car'] - prevdata['car']     datad['gra'] = newdata['gra'] - prevdata['gra']     datad['ama'] = newdata['ama'] - prevdata['ama']     datad['sco'] = newdata['sco'] - prevdata['sco']     datad['saf'] = newdata['saf'] - prevdata['saf']     datad['con'] = newdata['con'] - prevdata['con']     datad['eaf'] = newdata['eaf'] - prevdata['eaf']     datad['gui'] = newdata['gui'] - prevdata['gui']     datad['waf'] = newdata['waf'] - prevdata['waf']     datad['atl'] = newdata['atl'] - prevdata['atl']     datad['egy'] = newdata['egy'] - prevdata['egy']     datad['ara'] = newdata['ara'] - prevdata['ara']     datad['mpo'] = newdata['mpo'] - prevdata['mpo']     datad['per'] = newdata['per'] - prevdata['per']     datad['sub'] = newdata['sub'] - prevdata['sub']     datad['chi'] = newdata['chi'] - prevdata['chi']     datad['ind'] = newdata['ind'] - prevdata['ind']     datad['ein'] = newdata['ein'] - prevdata['ein']     datad['pac'] = newdata['pac'] - prevdata['pac']       datad['untapped'] = newdata['untapped'] - prevdata['untapped']     datad['plentiful'] = newdata['plentiful'] - prevdata['plentiful']     datad['halved'] = newdata['halved'] - prevdata['halved']     datad['low'] = newdata['low'] - prevdata['low']     datad['neardep'] = newdata['neardep'] - prevdata['neardep']     datad['depleted'] = newdata['depleted'] - prevdata['depleted']       datad['waag'] = newdata['waag'] - prevdata['waag']     datad['adored'] = newdata['adored'] - prevdata['adored']     datad['loved'] = newdata['loved'] - prevdata['loved']     datad['liked'] = newdata['liked'] - prevdata['liked']     datad['decent'] = newdata['decent'] - prevdata['decent']     datad['middling'] = newdata['middling'] - prevdata['middling']     datad['disliked'] = newdata['disliked'] - prevdata['disliked']     datad['hated'] = newdata['hated'] - prevdata['hated']     datad['despised'] = newdata['despised'] - prevdata['despised']     datad['eop'] = newdata['eop'] - prevdata['eop']       datad['libdem'] = newdata['libdem'] - prevdata['libdem']     datad['authdem'] = newdata['authdem'] - prevdata['authdem']     datad['opr'] = newdata['opr'] - prevdata['opr']     datad['junta'] = newdata['junta'] - prevdata['junta']     datad['dictat'] = newdata['dictat'] - prevdata['dictat']       datad['unsink'] = newdata['unsink'] - prevdata['unsink']     datad['entren'] = newdata['entren'] - prevdata['entren']     datad['vstable'] = newdata['vstable'] - prevdata['vstable']     datad['quiet'] = newdata['quiet'] - prevdata['quiet']     datad['calm'] = newdata['calm'] - prevdata['calm']     datad['tensions'] = newdata['tensions'] - prevdata['tensions']     datad['chaotic'] = newdata['chaotic'] - prevdata['chaotic']     datad['rioting'] = newdata['rioting'] - prevdata['rioting']     datad['protests'] = newdata['protests'] - prevdata['protests']     datad['collapse'] = newdata['collapse'] - prevdata['collapse']       datad['norebels'] = newdata['norebels'] - prevdata['norebels']     datad['terror'] = newdata['terror'] - prevdata['terror']     datad['guerrilla'] = newdata['guerrilla'] - prevdata['guerrilla']     datad['rebellion'] = newdata['rebellion'] - prevdata['rebellion']     datad['civil'] = newdata['civil'] - prevdata['civil']       datad['free'] = newdata['free'] - prevdata['free']     datad['mixed'] = newdata['mixed'] - prevdata['mixed']     datad['command'] = newdata['command'] - prevdata['command']       datad['developed'] = newdata['developed'] - prevdata['developed']     datad['good'] = newdata['good'] - prevdata['good']     datad['decent'] = newdata['decent'] - prevdata['decent']     datad['above'] = newdata['above'] - prevdata['above']     datad['average'] = newdata['average'] - prevdata['average']     datad['poorqol'] = newdata['poorqol'] - prevdata['poorqol']     datad['impov'] = newdata['impov'] - prevdata['impov']     datad['desp'] = newdata['desp'] - prevdata['desp']     datad['disast'] = newdata['disast'] - prevdata['disast']     datad['crisis'] = newdata['crisis'] - prevdata['crisis']       datad['west'] = newdata['west'] - prevdata['west']     datad['non'] = newdata['non'] - prevdata['non']     datad['east'] = newdata['east'] - prevdata['east']       datad['gandhi'] = newdata['gandhi'] - prevdata['gandhi']     datad['angelic'] = newdata['angelic'] - prevdata['angelic']     datad['nice'] = newdata['nice'] - prevdata['nice']     datad['good'] = newdata['good'] - prevdata['good']     datad['normal'] = newdata['normal'] - prevdata['normal']     datad['quest'] = newdata['quest'] - prevdata['quest']     datad['isolated'] = newdata['isolated'] - prevdata['isolated']     datad['pariah'] = newdata['pariah'] - prevdata['pariah']     datad['maddog'] = newdata['maddog'] - prevdata['maddog']     datad['aoe'] = newdata['aoe'] - prevdata['aoe']       troopd['troops'] = newtroopdata['troops'] - prevtroopdata['troops']     troopd['avgtroops'] = newtroopdata['avgtroops'] - prevtroopdata['avgtroops']       troopd['mam'] = newtroopdata['mam'] - prevtroopdata['mam']     troopd['car'] = newtroopdata['car'] - prevtroopdata['car']     troopd['gra'] = newtroopdata['gra'] - prevtroopdata['gra']     troopd['ama'] = newtroopdata['ama'] - prevtroopdata['ama']     troopd['sco'] = newtroopdata['sco'] - prevtroopdata['sco']     troopd['saf'] = newtroopdata['saf'] - prevtroopdata['saf']     troopd['con'] = newtroopdata['con'] - prevtroopdata['con']     troopd['eaf'] = newtroopdata['eaf'] - prevtroopdata['eaf']     troopd['gui'] = newtroopdata['gui'] - prevtroopdata['gui']     troopd['waf'] = newtroopdata['waf'] - prevtroopdata['waf']     troopd['atl'] = newtroopdata['atl'] - prevtroopdata['atl']     troopd['egy'] = newtroopdata['egy'] - prevtroopdata['egy']     troopd['ara'] = newtroopdata['ara'] - prevtroopdata['ara']     troopd['mpo'] = newtroopdata['mpo'] - prevtroopdata['mpo']     troopd['per'] = newtroopdata['per'] - prevtroopdata['per']     troopd['sub'] = newtroopdata['sub'] - prevtroopdata['sub']     troopd['chi'] = newtroopdata['chi'] - prevtroopdata['chi']     troopd['ind'] = newtroopdata['ind'] - prevtroopdata['ind']     troopd['ein'] = newtroopdata['ein'] - prevtroopdata['ein']     troopd['pac'] = newtroopdata['pac'] - prevtroopdata['pac']       return datad, troopd   print "\nLogging in..." while True:     try:         loginresponse = br.open('http://blocgame.com')     except:         print "Timeout, requesting again."     else:         break br.form = list(br.forms())[0] br["username"] = 'username' br["password"] = 'password' response = br.submit() # print BS(response.read()) print "Done."   alliancelinks = [] print "\nGetting alliance urls..." for i in range(1,3):     soup = getsoup('http://blocgame.com/alliancerankings.php?page=%s' % i)     # print soup.prettify()     for link in soup.find_all('a'):         text = str(link.get('href'))         if 'alliancestats.php?allianceid=' in text and '=0' not in text:             alliancelinks.append(link.get('href')) print "Done."   j = 1 names = [] data = [] uraniumlist = [] for i in alliancelinks:     print "\nGathering data on alliance %s of %s..." % (j, len(alliancelinks))     alliance = []     nations = []       soup = getsoup('http://blocgame.com/%s' % i)     names.append(soup.find('h1').string)       print '  Gathering nation links...'       for link in soup.find_all('a'):         if 'stats.php?id=' in str(link.get('href')):             nations.append(link.get('href'))       print '  %s nations found.' % str(len(nations))       k = 1     for i in nations:         soup = getsoup('http://blocgame.com/%s' % i)         nationdata = getdata(soup)         nationdata['id'] = i[13:]         if nationdata['uranium'] > 0:             uraniumlist.append({'name':nationdata['name'], 'id':nationdata['id'], 'uranium':nationdata['uranium']})         alliance.append(nationdata)         print '  %s of %s' % (str(k), str(len(nations)))         k += 1       data.append(alliance)     j += 1     print "Done."   uraniumlist.sort(key=itemgetter('uranium'), reverse=True)   from info import prevnow, prevdata, prevnames   now = datetime.datetime.utcnow() with open('info.py', 'w') as f:     f.write("import datetime\n")     f.write("prevnow = %s\n" % repr(now))     f.write("prevnames = %s\n" % repr(names))     f.write("prevdata = %s" % repr(data))   generaldata, troopdata = process(data)   prevgeneraldata, prevtroopdata, prevuraniumlist = process(prevdata)   diffnames = [] diffgeneraldata = [] difftroopdata = [] for alliance in names:     if alliance in prevnames:         diffnames.append(alliance)         newindex = names.index(alliance)         oldindex = prevnames.index(alliance)         diffgend, difftroopd = difference(generaldata[newindex], troopdata[newindex], prevgeneraldata[oldindex], prevtroopdata[oldindex])         diffgeneraldata.append(diffgend)         difftroopdata.append(difftroopd)   ########################################################   print "\nOutputting PDF..."   from reportlab.lib.styles import ParagraphStyle as PS from reportlab.platypus import PageBreak, Image, Table, TableStyle, Spacer from reportlab.platypus.paragraph import Paragraph from reportlab.platypus.doctemplate import PageTemplate, BaseDocTemplate from reportlab.platypus.tableofcontents import TableOfContents from reportlab.platypus.frames import Frame from reportlab.lib.units import cm from reportlab.lib.pagesizes import A4 from reportlab.lib import colors import numpy as np import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt   regions = ['Mesoamerica','Caribbean','Gran Colombia','Amazonia','Southern Cone','Southern Africa','Congo','East Africa','Guinea',     'West Africa','Atlas','Egypt','Arabia','Mesopotamia','Persia','The Subcontinent','China','Indochina','East Indies','Pacific Rim']   alignments = ['West', 'Neutral', 'East']   polsystems = ['Liberal Democracy','Authoritarian Democracy','One Party Rule','Military Junta','Dictatorship']   econsystems = ['Free Market','Mixed Economy','Central Planning']   approvallevels = ['Worshiped as a God','Adored','Loved','Liked','Decent','Middling','Disliked','Hated','Despised','Enemy of the People']   stabilitylevels = ['Unsinkable','Entrenched','Very Stable','Quiet','Calm','Growing Tensions','Chaotic','Rioting','Mass Protests','Brink of Collapse']   rebellevels = ['None','Scattered Terrorists','Guerrillas','Open Rebellion','Civil War']   qollevels = ['Developed','Good','Decent','Above Average','Average','Poor','Impoverished','Desperate','Disastrous','Humanitarian Crisis']   reputationlevels = ['Gandhi-Like','Angelic','Nice','Good','Normal','Questionable','Isolated','Pariah','Mad Dog','Axis of Evil']   techlevels = ['Advanced','Persian','Almost Modern','Vietnam','Korean','World War II','World War I','19th Century','Stone Age']   airforcelevels = ['Very Powerful','Powerful','Large','Somewhat Large','Mediocre','Meagre','Small','None']   traininglevels = ['Elite','Good','Standard','Poor','Rabble']   manpowerlevels = ['Untapped','Plentiful','Halved','Low','Near Depletion','Depleted']     class MyDocTemplate(BaseDocTemplate):     def __init__(self, filename, **kw):         self.allowSplitting = 0         apply(BaseDocTemplate.__init__, (self, filename), kw)         template = PageTemplate('normal', [Frame(1.5*cm, 1.5*cm, 18*cm, 26.7*cm, id='F1')])         self.addPageTemplates(template)       def afterFlowable(self, flowable):         "Registers TOC entries."         if flowable.__class__.__name__ == 'Paragraph':             text = flowable.getPlainText()             style = flowable.style.name             if style == 'Heading1':                 level = 0             elif style == 'Heading2':                 level = 1             else:                 return             E = [level, text, self.page]             #if we have a bookmark name append that to our notify data             bn = getattr(flowable,'_bookmarkName',None)             if bn is not None: E.append(bn)             self.notify('TOCEntry', tuple(E))   def doHeading(text,sty):     from hashlib import sha1     bn=sha1(text+sty.name).hexdigest()     h=Paragraph(text+'' % bn,sty)     h._bookmarkName=bn     story.append(h)   def maketable(tdata):     t = Table(tdata)     t.setStyle(TableStyle([('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE'),         ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),('BOX', (0,0), (-1,-1), 0.25, colors.black)]))     story.append(t)     story.append(Spacer(cm, 1*cm))   def tableonly(name, categories, data):     for index, value in enumerate(data):         if value > 0:             data[index] = Paragraph('+%s' % value, PS('body'))         elif value < 0:             data[index] = Paragraph('%s' % value, PS('body'))     tdata = [(name, 'Difference')] + [(categories[i], data[i]) for i in range(len(categories))]     maketable(tdata)   def graphanddata(xdata, ydata, ylabel, no):     N = len(xdata)     means = ydata       ind = np.arange(N)  # the x locations for the groups     width = 0.75      # the width of the bars       fig = plt.figure(figsize=(5,4))     plt.subplots_adjust(bottom=0.25)     ax = fig.add_subplot(111)     rects = ax.bar(ind, means, width, color='r')       ax.set_ylabel(ylabel)     ax.grid(b=True, which='major', axis='y', zorder=3)     ax.set_xticks(ind+0.40)     ax.set_axisbelow(True)     ax.set_xlim(left=-0.25)     ax.set_xticklabels(xdata, fontsize=8, rotation='vertical')     ax.tick_params(direction='out', top=False, bottom=False, right=False)       plt.savefig('foo%s.png' % no, bbox_inches='tight')     plt.close()     f = open('foo%s.png' % no, 'rb')     story.append(Image(f))       if len(xdata) <= 10:         tdata = [(xdata[i], ydata[i]) for i in range(len(xdata))]     else:         tdata = [(xdata[i], ydata[i], xdata[i+10], ydata[i+10]) for i in range(10)]       maketable(tdata)       story.append(PageBreak())   title = PS(name='title', fontSize=50, leading=16, alignment=1, spaceAfter=20) smallertitle = PS(name='smallertitle', fontSize=30, leading=16, alignment=1, spaceAfter=20) h1 = PS(name='Heading1', fontSize=25, leading=15, spaceAfter=30) h2 = PS(name='Heading2', fontSize=16, leading=8, spaceAfter=20) h3 = PS(name='Heading3', fontSize=14, leading=8, spaceAfter=20) tagline = PS(name='tagline', fontSize=20, leading=14, alignment=1)   story = []   toc = TableOfContents() toc.levelStyles = [     PS(fontName='Times-Bold', fontSize=15, name='TOCHeading1', leftIndent=20, firstLineIndent=-20, spaceBefore=5, leading=5),     PS(fontSize=12, name='TOCHeading2', leftIndent=40, firstLineIndent=-20, spaceBefore=3, leading=3),     PS(fontSize=12, name='TOCHeading3', leftIndent=60, firstLineIndent=-20, spaceBefore=3, leading=3), ]   story.append(Paragraph('>BLOC Dossier', title)) story.append(Spacer(cm, 1*cm)) story.append(Paragraph('Generated on %s' % now.strftime('%d %B, %H:%M:%S'), tagline)) story.append(Spacer(cm, 1.5*cm)) story.append(Image('insert.png', 15*cm, 21*cm)) story.append(PageBreak())   story.append(Paragraph('Table of Contents', smallertitle)) story.append(toc) story.append(PageBreak())   print '  Initial done.'   doHeading('General Comparisons', h1)   doHeading('Alliance Size', h2) data = [alliance['size'] for alliance in generaldata] graphanddata(names, data, 'Alliance Size', 1)   doHeading('Total GDP', h2) data = [alliance['gdp'] for alliance in generaldata] graphanddata(names, data, 'Total GDP ($million)', 2)   doHeading('Average GDP', h2) data = [alliance['avggdp'] for alliance in generaldata] graphanddata(names, data, 'Average GDP ($million)', 3)   doHeading('Total growth', h2) data = [alliance['growth'] for alliance in generaldata] graphanddata(names, data, 'Total growth ($million / month)', 4)   doHeading('Average growth', h2) data = [alliance['avggrowth'] for alliance in generaldata] graphanddata(names, data, 'Average growth ($million / month)', 5)   doHeading('Total troops', h2) data = [alliance['troops'] for alliance in troopdata] graphanddata(names, data, 'Total troops (k)', 19)   doHeading('Average troops', h2) data = [alliance['avgtroops'] for alliance in troopdata] graphanddata(names, data, 'Average troops (k)', 20)   doHeading('Total Factories', h2) data = [alliance['factories'] for alliance in generaldata] graphanddata(names, data, 'Total Factories', 6)   doHeading('Average Factories', h2) data = [alliance['avgfactories'] for alliance in generaldata] graphanddata(names, data, 'Average Factories', 7)   doHeading('Total RM production', h2) data = [alliance['rmprod'] for alliance in generaldata] graphanddata(names, data, 'Total RM production (100 Tons / month)', 8)   doHeading('Average RM production', h2) data = [alliance['avgrmprod'] for alliance in generaldata] graphanddata(names, data, 'Average RM production (100 Tons / month)', 9)   doHeading('Total oil production', h2) data = [alliance['oilprod'] for alliance in generaldata] graphanddata(names, data, 'Total oil production (Mbbl / month)', 10)   doHeading('Average oil production', h2) data = [alliance['avgoilprod'] for alliance in generaldata] graphanddata(names, data, 'Average oil production (Mbbl / month)', 11)   doHeading('Total oil reserves', h2) data = [alliance['oilres'] for alliance in generaldata] graphanddata(names, data, 'Total oil reserves (Mbbl)', 12)   doHeading('Average oil reserves', h2) data = [alliance['avgoilres'] for alliance in generaldata] graphanddata(names, data, 'Average oil reserves (Mbbl)', 13)   doHeading('Total territory', h2) data = [alliance['territory'] for alliance in generaldata] graphanddata(names, data, 'Total territory (km^2)', 14)   doHeading('Average territory', h2) data = [alliance['avgterritory'] for alliance in generaldata] graphanddata(names, data, 'Average territory (km^2)', 15)   doHeading('Total time inactive', h2) data = [alliance['inactive'] for alliance in generaldata] graphanddata(names, data, 'Total time inactive (hours)', 16)   doHeading('Average time inactive', h2) data = [alliance['avginactive'] for alliance in generaldata] graphanddata(names, data, 'Average time inactive (hours)', 17)   doHeading('Total uranium', h2) data = [alliance['uranium'] for alliance in generaldata] graphanddata(names, data, 'Total uranium (Tons)', 18)   print '  General comparisons done.'   doHeading('Alliance Panels', h1) for i in range(len(names)):     doHeading('%s' % names[i], h2)       story.append(Paragraph('Tech Level counts', h3))     data = [generaldata[i]['advanced'], generaldata[i]['persian'], generaldata[i]['almost'], generaldata[i]['vietnam'], generaldata[i]['korean'],         generaldata[i]['second'], generaldata[i]['first'], generaldata[i]['finest'], generaldata[i]['stone']]     graphanddata(techlevels, data, 'No. of nations', 30+14*i)       story.append(Paragraph('Training Level counts', h3))     data = [generaldata[i]['elite'], generaldata[i]['good'], generaldata[i]['standard'], generaldata[i]['poortr'], generaldata[i]['rabble']]     graphanddata(traininglevels, data, 'No. of nations', 32+14*i)       story.append(Paragraph('Airforce Level counts', h3))     data = [generaldata[i]['vpowerful'], generaldata[i]['powerful'], generaldata[i]['large'], generaldata[i]['somelarge'],         generaldata[i]['mediocre'], generaldata[i]['meagre'], generaldata[i]['small'], generaldata[i]['noair']]     graphanddata(airforcelevels, data, 'No. of nations', 31+14*i)       story.append(Paragraph('Manpower Level counts', h3))     data = [generaldata[i]['untapped'], generaldata[i]['plentiful'], generaldata[i]['halved'], generaldata[i]['low'],         generaldata[i]['neardep'], generaldata[i]['depleted']]     graphanddata(manpowerlevels, data, 'No. of nations', 33+14*i)       story.append(Paragraph('Region counts', h3))     data = [generaldata[i]['mam'], generaldata[i]['car'], generaldata[i]['gra'], generaldata[i]['ama'], generaldata[i]['sco'],         generaldata[i]['saf'], generaldata[i]['con'], generaldata[i]['eaf'], generaldata[i]['gui'], generaldata[i]['waf'],         generaldata[i]['atl'], generaldata[i]['egy'], generaldata[i]['ara'], generaldata[i]['mpo'], generaldata[i]['per'],         generaldata[i]['sub'], generaldata[i]['chi'], generaldata[i]['ind'], generaldata[i]['ein'], generaldata[i]['pac']]     graphanddata(regions, data, 'No. of nations', 21+14*i)       story.append(Paragraph('Region troop counts', h3))     data = [troopdata[i]['mam'], troopdata[i]['car'], troopdata[i]['gra'], troopdata[i]['ama'], troopdata[i]['sco'],         troopdata[i]['saf'], troopdata[i]['con'], troopdata[i]['eaf'], troopdata[i]['gui'], troopdata[i]['waf'],         troopdata[i]['atl'], troopdata[i]['egy'], troopdata[i]['ara'], troopdata[i]['mpo'], troopdata[i]['per'],         troopdata[i]['sub'], troopdata[i]['chi'], troopdata[i]['ind'], troopdata[i]['ein'], troopdata[i]['pac']]     graphanddata(regions, data, 'Troops (k)', 34+14*i)       story.append(Paragraph('Alignment counts', h3))     data = [generaldata[i]['west'], generaldata[i]['non'], generaldata[i]['east']]     graphanddata(alignments, data, 'No. of nations', 22+14*i)       story.append(Paragraph('Political System counts', h3))     data = [generaldata[i]['libdem'], generaldata[i]['authdem'], generaldata[i]['opr'], generaldata[i]['junta'], generaldata[i]['dictat']]     graphanddata(polsystems, data, 'No. of nations', 23+14*i)       story.append(Paragraph('Economic System counts', h3))     data = [generaldata[i]['free'], generaldata[i]['mixed'], generaldata[i]['command']]     graphanddata(econsystems, data, 'No. of nations', 24+14*i)       story.append(Paragraph('Approval counts', h3))     data = [generaldata[i]['waag'], generaldata[i]['adored'], generaldata[i]['loved'], generaldata[i]['liked'], generaldata[i]['decent'],         generaldata[i]['middling'], generaldata[i]['disliked'], generaldata[i]['hated'], generaldata[i]['despised'], generaldata[i]['eop']]     graphanddata(approvallevels, data, 'No. of nations', 25+14*i)       story.append(Paragraph('Stability counts', h3))     data = [generaldata[i]['unsink'], generaldata[i]['entren'], generaldata[i]['vstable'], generaldata[i]['quiet'], generaldata[i]['calm'],         generaldata[i]['tensions'], generaldata[i]['chaotic'], generaldata[i]['rioting'], generaldata[i]['protests'], generaldata[i]['collapse']]     graphanddata(stabilitylevels, data, 'No. of nations', 26+14*i)       story.append(Paragraph('Rebel counts', h3))     data = [generaldata[i]['norebels'], generaldata[i]['terror'], generaldata[i]['guerrilla'], generaldata[i]['rebellion'], generaldata[i]['civil']]     graphanddata(rebellevels, data, 'No. of nations', 27+14*i)       story.append(Paragraph('QoL counts', h3))     data = [generaldata[i]['developed'], generaldata[i]['good'], generaldata[i]['decent'], generaldata[i]['above'], generaldata[i]['average'],         generaldata[i]['poorqol'], generaldata[i]['impov'], generaldata[i]['desp'], generaldata[i]['disast'], generaldata[i]['crisis']]     graphanddata(qollevels, data, 'No. of nations', 28+14*i)       story.append(Paragraph('Reputation counts', h3))     data = [generaldata[i]['gandhi'], generaldata[i]['angelic'], generaldata[i]['nice'], generaldata[i]['good'], generaldata[i]['normal'],         generaldata[i]['quest'], generaldata[i]['isolated'], generaldata[i]['pariah'], generaldata[i]['maddog'], generaldata[i]['aoe']]     graphanddata(reputationlevels, data, 'No. of nations', 29+14*i)       print '  %s of %s panels done' % (str(i+1), str(len(names)))   doHeading('Differences (from %s)' % prevnow.strftime('%d %B, %H:%M:%S'), h1) doHeading('General Comparisons diff', h1)   doHeading('Alliance Size diff', h2) data = [alliance['size'] for alliance in diffgeneraldata] tableonly('Alliance Size', diffnames, data)   story.append(PageBreak())   doHeading('Total GDP diff', h2) data = [alliance['gdp'] for alliance in diffgeneraldata] tableonly('GDP', diffnames, data)   story.append(PageBreak())   doHeading('Total growth diff', h2) data = [alliance['growth'] for alliance in diffgeneraldata] tableonly('Growth', diffnames, data)   story.append(PageBreak())   doHeading('Total troops diff', h2) data = [alliance['troops'] for alliance in difftroopdata] tableonly('Troops', diffnames, data)   story.append(PageBreak())   doHeading('Total Factories diff', h2) data = [alliance['factories'] for alliance in diffgeneraldata] tableonly('Factories', diffnames, data)   story.append(PageBreak())   doHeading('Total RM production diff', h2) data = [alliance['rmprod'] for alliance in diffgeneraldata] tableonly('RM Production', diffnames, data)   story.append(PageBreak())   doHeading('Total oil production diff', h2) data = [alliance['oilprod'] for alliance in diffgeneraldata] tableonly('Oil Production', diffnames, data)   story.append(PageBreak())   doHeading('Total oil reserves diff', h2) data = [alliance['oilres'] for alliance in diffgeneraldata] tableonly('Oil Reserves', diffnames, data)   story.append(PageBreak())   doHeading('Total territory diff', h2) data = [alliance['territory'] for alliance in diffgeneraldata] tableonly('Territory', diffnames, data)   story.append(PageBreak())   doHeading('Total time inactive diff', h2) data = [alliance['inactive'] for alliance in diffgeneraldata] tableonly('Time inactive', diffnames, data)   story.append(PageBreak())   print '  General differences done'   doHeading('Alliance Panels diff', h1) for i in range(len(diffnames)):     doHeading('%s' % names[i], h2)       story.append(Paragraph('Tech Level counts diff', h3))     data = [diffgeneraldata[i]['advanced'], diffgeneraldata[i]['persian'], diffgeneraldata[i]['almost'],         diffgeneraldata[i]['vietnam'], diffgeneraldata[i]['korean'], diffgeneraldata[i]['second'],         diffgeneraldata[i]['first'], diffgeneraldata[i]['finest'], diffgeneraldata[i]['stone']]     tableonly('Tech levels', techlevels, data)       story.append(Paragraph('Training Level counts diff', h3))     data = [diffgeneraldata[i]['elite'], diffgeneraldata[i]['good'], diffgeneraldata[i]['standard'],         diffgeneraldata[i]['poortr'], diffgeneraldata[i]['rabble']]     tableonly('Training levels', traininglevels, data)       story.append(Paragraph('Airforce Level counts diff', h3))     data = [diffgeneraldata[i]['vpowerful'], diffgeneraldata[i]['powerful'], diffgeneraldata[i]['large'],         diffgeneraldata[i]['somelarge'], diffgeneraldata[i]['mediocre'], diffgeneraldata[i]['meagre'],         diffgeneraldata[i]['small'], diffgeneraldata[i]['noair']]     tableonly('Airforce levels', airforcelevels, data)       story.append(PageBreak())       story.append(Paragraph('Manpower Level counts diff', h3))     data = [diffgeneraldata[i]['untapped'], diffgeneraldata[i]['plentiful'], diffgeneraldata[i]['halved'],         diffgeneraldata[i]['low'], diffgeneraldata[i]['neardep'], diffgeneraldata[i]['depleted']]     tableonly('Manpower levels', manpowerlevels, data)       story.append(Paragraph('Region counts diff', h3))     data = [diffgeneraldata[i]['mam'], diffgeneraldata[i]['car'], diffgeneraldata[i]['gra'], diffgeneraldata[i]['ama'],         diffgeneraldata[i]['sco'], diffgeneraldata[i]['saf'], diffgeneraldata[i]['con'], diffgeneraldata[i]['eaf'],         diffgeneraldata[i]['gui'], diffgeneraldata[i]['waf'], diffgeneraldata[i]['atl'], diffgeneraldata[i]['egy'],         diffgeneraldata[i]['ara'], diffgeneraldata[i]['mpo'], diffgeneraldata[i]['per'], diffgeneraldata[i]['sub'],         diffgeneraldata[i]['chi'], diffgeneraldata[i]['ind'], diffgeneraldata[i]['ein'], diffgeneraldata[i]['pac']]     tableonly('Region counts', regions, data)       story.append(PageBreak())       story.append(Paragraph('Region troop counts diff', h3))     data = [difftroopdata[i]['mam'], difftroopdata[i]['car'], difftroopdata[i]['gra'], difftroopdata[i]['ama'], difftroopdata[i]['sco'],         difftroopdata[i]['saf'], difftroopdata[i]['con'], difftroopdata[i]['eaf'], difftroopdata[i]['gui'], difftroopdata[i]['waf'],         difftroopdata[i]['atl'], difftroopdata[i]['egy'], difftroopdata[i]['ara'], difftroopdata[i]['mpo'], difftroopdata[i]['per'],         difftroopdata[i]['sub'], difftroopdata[i]['chi'], difftroopdata[i]['ind'], difftroopdata[i]['ein'], difftroopdata[i]['pac']]     tableonly('Region troop counts', regions, data)       story.append(Paragraph('Alignment counts diff', h3))     data = [diffgeneraldata[i]['west'], diffgeneraldata[i]['non'], diffgeneraldata[i]['east']]     tableonly('Alignments', alignments, data)       story.append(Paragraph('Political System counts diff', h3))     data = [diffgeneraldata[i]['libdem'], diffgeneraldata[i]['authdem'], diffgeneraldata[i]['opr'], diffgeneraldata[i]['junta'],         diffgeneraldata[i]['dictat']]     tableonly('Political systems', polsystems, data)       story.append(PageBreak())       story.append(Paragraph('Economic System counts diff', h3))     data = [diffgeneraldata[i]['free'], diffgeneraldata[i]['mixed'], diffgeneraldata[i]['command']]     tableonly('Economic systems', econsystems, data)       story.append(Paragraph('Approval counts diff', h3))     data = [diffgeneraldata[i]['waag'], diffgeneraldata[i]['adored'], diffgeneraldata[i]['loved'], diffgeneraldata[i]['liked'],         diffgeneraldata[i]['decent'], diffgeneraldata[i]['middling'], diffgeneraldata[i]['disliked'], diffgeneraldata[i]['hated'],         diffgeneraldata[i]['despised'], diffgeneraldata[i]['eop']]     tableonly('Approval levels', approvallevels, data)       story.append(Paragraph('Stability counts diff', h3))     data = [diffgeneraldata[i]['unsink'], diffgeneraldata[i]['entren'], diffgeneraldata[i]['vstable'], diffgeneraldata[i]['quiet'],         diffgeneraldata[i]['calm'], diffgeneraldata[i]['tensions'], diffgeneraldata[i]['chaotic'], diffgeneraldata[i]['rioting'],         diffgeneraldata[i]['protests'], diffgeneraldata[i]['collapse']]     tableonly('Stability levels', stabilitylevels, data)       story.append(PageBreak())       story.append(Paragraph('Rebel counts diff', h3))     data = [diffgeneraldata[i]['norebels'], diffgeneraldata[i]['terror'], diffgeneraldata[i]['guerrilla'],         diffgeneraldata[i]['rebellion'], diffgeneraldata[i]['civil']]     tableonly('Rebel levels', rebellevels, data)       story.append(Paragraph('QoL counts diff', h3))     data = [diffgeneraldata[i]['developed'], diffgeneraldata[i]['good'], diffgeneraldata[i]['decent'], diffgeneraldata[i]['above'],         diffgeneraldata[i]['average'], diffgeneraldata[i]['poorqol'], diffgeneraldata[i]['impov'], diffgeneraldata[i]['desp'],         diffgeneraldata[i]['disast'], diffgeneraldata[i]['crisis']]     tableonly('QoL levels', qollevels, data)       story.append(Paragraph('Reputation counts diff', h3))     data = [diffgeneraldata[i]['gandhi'], diffgeneraldata[i]['angelic'], diffgeneraldata[i]['nice'], diffgeneraldata[i]['good'],         diffgeneraldata[i]['normal'], diffgeneraldata[i]['quest'], diffgeneraldata[i]['isolated'], diffgeneraldata[i]['pariah'],         diffgeneraldata[i]['maddog'], diffgeneraldata[i]['aoe']]     tableonly('Reputation levels', reputationlevels, data)       story.append(PageBreak())       print '  %s of %s panel diffs done' % (str(i+1), str(len(names)))   tdata = [('Nation Name', 'Nation ID', 'Uranium Quantity')] + [(nation['name'], nation['id'], nation['uranium']) for nation in uraniumlist] t = Table(tdata) t.setStyle(TableStyle([('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE'),     ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),('BOX', (0,0), (-1,-1), 0.25, colors.black)])) story.append(t)   story.append(PageBreak())   doc = MyDocTemplate('bloc.pdf', pagesize=A4, title='BLOC Dossier', author='heidi') doc.multiBuild(story)   print "Done."   print "\nCopying to ftp..." import shutil   shutil.move('bloc.pdf', '/home/heidi/ftp/bloc.pdf') print "Done."