import pywikibot, mwparserfromhell, re
#from pprint import pprint

sourcepage = 'Gebruiker:Vinkje83/WTA150'

class Dame:
        def __init__(self, rij):
                nummer, speelster, punten, verandering = rij._contents.nodes
                self.nieuwe_rangpositie = int(nummer.contents.strip_code().replace('. ', ''))
                self.naam = speelster.contents.filter_wikilinks()[0].title
                self.verandering = verandering.contents.filter_templates()[0].title()
                self.bestaande_rangpositie = 0
        def load_enkelhoogstepositie(self, site):
                p = pywikibot.Page(site, self.naam)
                wikicode = mwparserfromhell.parse(p.text)
                "Enkelhoogstepositie  Infobox tennisspeler"
                infoboxes = [template for template in wikicode.filter_templates(matches=lambda t: t.name.matches('Infobox tennisspeler'))]
                if len(infoboxes) is 0:
                        self.bestaande_rangpositie = -1
                        return
                if ('Enkelhoogstepositie' in infoboxes[0]):
                  positie_text = infoboxes[0].get('Enkelhoogstepositie').value.strip_code() # "17. (18 april 2018)"
                  if (positie_text != ''):
                    self.bestaande_rangpositie = int(re.findall('[0-9]+', positie_text)[0])


def laadtennistabel(site):
        p = pywikibot.Page(site, sourcepage)
        wikicode = mwparserfromhell.parse(p.text)
        dames = [Dame(rij) for rij in wikicode.filter_tags(matches=lambda node: node.tag == 'tr')[1:]]
        "Dames met verlies en stabiel overslaan, blijft over winst"
        dames = [dame for dame in dames if dame.verandering == '{{Winst}}' ]
        for dame in dames:
                dame.load_enkelhoogstepositie(site)
        return dames

def main(*args):
        local_args = pywikibot.handle_args(args)
        site = pywikibot.Site('nl','wikipedia')

        dames = laadtennistabel(site)
        geenbox = [(dame.naam, 'N = %d-Geen infobox' % (dame.nieuwe_rangpositie)) for dame in dames if dame.bestaande_rangpositie is -1]
        nietgevonden = [(dame.naam, 'Geen bestaande rangpositie') for dame in dames if dame.bestaande_rangpositie is 0]
        gestegen = [(dame.naam, 'N &lt; H (%d < %d)' % (dame.nieuwe_rangpositie, dame.bestaande_rangpositie)) for dame in dames if dame.nieuwe_rangpositie < dame.bestaande_rangpositie]

        
        #pprint(nietgevonden + gestegen + geenbox)
        resulttxt='infobox mag worden bijgewerkt voor: \n\n;Niet gevonden\n'
        for x in nietgevonden:
          resulttxt+=('*[[%s]]-%s\n'%(x[0],x[1]) )
        resulttxt += '\n;Gestegen\n'
        for x in gestegen:
          resulttxt+=('*[[%s]]-%s\n'%(x[0],x[1]) )
        resulttxt += '\n;Geen infobox\n'
        for x in geenbox:
          resulttxt+=('*[[%s]]-%s\n'%(x[0],x[1]) )
          
        pywikibot.Page(site,'User:Vinkje83/WTA150/results').put(resulttxt,summary='WTA statistics updated')

print('Begonnen')
main()
print('Klaar')
Begonnen
WARNING: /srv/paws/pwb/pywikibot/bot.py:907: UserWarning: Site objects have been created before arguments were handled
  UserWarning)

WARNING: API error badtoken: Invalid CSRF token.
Sleeping for 9.8 seconds, 2018-12-18 13:40:56
Klaar
Page [[nl:Gebruiker:Vinkje83/WTA150/results]] saved