Wikidata/Pywikibot/fotbalisti.py

Píše to Matěj Suchánek na Etherpad, pomáhá Frettie (commenty aj.)

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
# bez určení kódování lze kód psát pouze v ASCII

# knihovna
import pywikibot
import re

# generátory
from pywikibot import pagegenerators, textlib, link_regex

# reprezentace wiki; jediný způsob komunikace
site = pywikibot.Site('cs', 'wikipedia')

genFactory  = pagegenerators.GeneratorFactory(site=site)
genFactory.handleArg('-ns:0')
genFactory.handleArg('-transcludes:Infobox - fotbalista')
generator = genFactory.getCombinedGenerator(preload=True) # počkej, než se pár stránek načte, ať je nezpracováváš po jedné a pak nečekáš na další

site = pywikibot.getSite('cs', 'wikipedia') # Frettieho verze
page = pywikibot.Page(site, u'Template:Infobox - fotbalista') # u = datový typ "unicode"
generator = pagegenerators.ReferringPageGenerator(page, onlyTemplateInclusion=True)

# <, mezera libovolněkrát, jméno br tagu, mezera libovolněkrát, lomítko až jednou
# Regex Golf: https://xkcd.com/1313/
regex = re.compile(r'< *br */? *>')
regex2 = re.compile(r'\{\{.*?\}\}', flags=re.S)
regex3 = re.compile(r'[-–—]')

for page in generator:
    try:
        item = page.data_item()
    except pywikibot.NoPage:
        continue
    data = textlib.extract_templates_and_params(page.text, strip=True) # strip = zbav zbytečných bílých znaků
    for template, parameters in data:
        if template != "Infobox - fotbalista":
            continue # tuhle šablonu nezpracovávej, přejdi na další
        
        # Pro nalezenou šablonu Infobox - fotbalista
        kluby = parameters.get('kluby')
        roky = parameters.get('roky')
        zapasy = parameters.get('zápasy (góly)')
        if not (kluby and roky and zapasy):
            break
        kluby_split = regex.split(kluby)
        roky_split = regex.split(roky)
        zapasy_split = regex.split(zapasy)
        if len(kluby_split) not in [len(roky_split), len(zapasy_split)]:
            break
        rows = []
        for i in range(len(kluby_split)):
            rows.append(
                (kluby_split[i], roky_split[i], zapasy_split[i])
            )
        for klub, roky, zapasy in rows:
            klub = regex2.sub('', klub).strip()
            match = link_regex.search(klub)
            if match:
                stranka = pywikibot.Page(site, match.group('title'))
            else:
                stranka = pywikibot.Page(site, klub)
            if not stranka.exists():
                continue
            if stranka.isRedirectPage():
                stranka = stranka.getRedirectTarget()
            try:
                klub_item = stranka.data_item()
            except pywikibot.NoPage:
                continue # tak ji založ
            claim = pywikibot.Claim(repo, 'P54')
            claim.setTarget(club_item)
            item.addClaim(claim)
            datum = regex3.split(roky)