Skripte

Aus Klexikon - Das Freie Kinderlexikon
Wechseln zu: Navigation, Suche

Skript zur Aktualisierung der Länder-Infoboxen

import requests
import pywikibot
import mwparserfromhell
import locale
 
# Verwende deutsches Zahlenformat mit Tausenderpunkt und Dezimalkomma
locale.setlocale(locale.LC_NUMERIC, 'german')
 
# Zuordnung von Wikidata-Abfrage-Feldern zu Vorlage-Parametern
fieldmap = {
    'Name': 'itemLabel',
    'Flagge': 'safeFlaggenDatei',
    'Hauptstadt': 'hauptstaedte',
    'Amtssprache': 'amtssprachen',
    'Staatsoberhaupt': 'oberhaeupter',
    'Einwohnerzahl': 'max_ew_in_mio',
    'Fläche': 'max_flaeche_rund',
    'Lagekarte': 'safeKartenDatei',
    'Lagebeschreibung': 'itemLabel'
}
 
# Legt fest, welche Länder-Artikel bzw. Vorlagen-Parameter Klexibot nicht ändern soll
blacklist = {
    'Eidgenossenschaft',
    'Deutsches Kaiserreich'
}
 
# Anmeldung beim Klexikon
site = pywikibot.Site()
 
# Lade Wikidata-Tabelle und speichere sie in "data"-Variable
url = 'https://query.wikidata.org/sparql'
with open('infobox_data_query.rq', 'r') as query_file: qry = query_file.read()
r = requests.get(url, params = {'format': 'json', 'query': qry }, headers = {
    'User-Agent':f'{requests.utils.default_headers()["User-Agent"]} (Klexikon bot by User:Tkarcher)'})
data = r.json()
 
# Gehe Wikidata-Tabelle Zeile für Zeile durch
for item in data['results']['bindings']:
    title = item['titel_im_klexikon']['value']
 
    # Ignoriere Artikel, die in der Ausschlußliste enthalten sind
    if title not in blacklist:
 
        # Öffne Vorlagen-Seite oder lege sie neu an
        page = pywikibot.Page(site, f'Vorlage:Infobox_{title}')
        code = mwparserfromhell.parse(page.text if page.text != '' else '{{Infobox Land\n}}')
 
        # Fülle alle Vorlagen-Felder
        for prop, field in fieldmap.items():
 
            # Ignoriere Vorlagen-Parameter, die leer oder in der Ausschlußliste enthalten sind
            if field in item and f'{title}:{prop}' not in blacklist:
                if prop == 'Einwohnerzahl':
                    ew = float(item[field]['value'])
                    if ew > 1:
                        val = f'etwa {locale.format_string("%.0f", ew, grouping = True)} Millionen'
                    else:
                        val = f'etwa {locale.format_string("%.0f", ew * 1000000, grouping = True)}'
                elif prop == 'Fläche':
                    val = locale.format_string('%i', int(item[field]['value']), grouping = True)
                    val = f'etwa {val} [[Meter|Quadratkilometer]]'
                elif prop == 'Staatsoberhaupt':
                    if 'oberhaupt_bezeichnung' in item:
                        val = item['oberhaupt_bezeichnung']['value'] + ' ' + item[field]['value']
                    else:
                        val = item[field]['value']
                elif prop == 'Lagebeschreibung':
                    # Manche Länder (Schweiz, USA, ...) brauchen weibliche Artikel,
                    # andere (Irak, Iran) männliche, andere gar keine...
                    # deshalb erstmal nur sehr generisch:
                    val = 'Wo das Land liegt'
                else: val = item[field]['value']
                code.filter_templates()[0].add(
                    f' {prop} ', f' {val}\n', preserve_spacing = False)
 
        # Speichere die Vorlagenseite
        page.text = str(code)
        page.save('Automatische Anlage der Länder-Infobox (zweiter Testlauf mit 3 Ländern)')
 
        # Öffne Länder-Artikel
        page = pywikibot.Page(site, title)
        code = mwparserfromhell.parse(page.text)
 
        # Binde Länder-Infobox ein, falls noch nicht geschehen
        if not code.filter_templates()[0].name.matches(f'Infobox_{title}'):
            page.text = f'{{{{Infobox_{title}}}}}\n{page.text}'
            page.save('Automatische Einbindung der Länder-Infobox (zweiter Testlauf mit 3 Ländern)')