Wikidata/Pywikibot/fotbalisti.py
Vzhled
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)