Benutzer:Klexibot/Skripte

Aus Klexikon – das Kinderlexikon
< Benutzer:Klexibot
Version vom 5. April 2019, 10:54 Uhr von Thomas Karcher (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Skript zur Aktualisierung der Länder-Infoboxen == <syntaxhighlight lang="python"> import requests import pywikibot import mwparserfromhell import locale #…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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})
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ßlist 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':
                    val = locale.format_string('%.2f', float(item[field]['value']))
                    val = f'etwa {val} Millionen'
                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 (erster Testlauf mit 3 Ländern)')

        # Öffne Länder-Artikel
        page = pywikibot.Page(site, f'{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 (erster Testlauf mit 3 Ländern)')