Benutzer:Klexibot/Skripte: Unterschied zwischen den Versionen
Aus Klexikon – das Kinderlexikon
(+Wartungskategorien in den Länderartikeln, +Kleinigkeiten) |
(Skript aktualisiert) |
||
Zeile 26: | Zeile 26: | ||
'Eidgenossenschaft', | 'Eidgenossenschaft', | ||
'Deutsches Kaiserreich' | 'Deutsches Kaiserreich' | ||
} | |||
# Parameter aus dieser Liste werden nur gefüllt, falls bisher kein Wert enthalten war | |||
preserved_values = { | |||
'Lagekarte', | |||
'Lagebeschreibung' | |||
} | } | ||
Zeile 58: | Zeile 64: | ||
# Ignoriere Vorlagen-Parameter, die leer oder in der Ausschlußliste enthalten sind | # Ignoriere Vorlagen-Parameter, die leer oder in der Ausschlußliste enthalten sind | ||
if field in item and f'{title}:{prop}' not in blacklist: | if field in item and f'{title}:{prop}' not in blacklist: | ||
if prop == 'Einwohnerzahl': | |||
# Ignoriere auch Parameter, die nicht überschrieben werden sollen | |||
if not ( | |||
prop in preserved_values and | |||
code.filter_templates()[0].has(prop) and | |||
code.filter_templates()[0].get(prop).value != ''): | |||
if prop == 'Einwohnerzahl': | |||
ew = float(item[field]['value']) | |||
if ew > 1: | |||
val = f'etwa {locale.format_string("%.0f", ew, grouping = True)} [[Million]]en' | |||
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 Änderungen, falls vorhanden, und verschiebe | # Speichere die Änderungen, falls vorhanden, und verschiebe | ||
Zeile 87: | Zeile 100: | ||
# Speichere Vorlage | # Speichere Vorlage | ||
page.text = str(code) | page.text = str(code) | ||
page.save('Automatische Anlage der Länder-Infobox ( | page.save('Automatische Anlage der Länder-Infobox (erste 12 Länder)') | ||
# Öffne Länderartikel | # Öffne Länderartikel | ||
Zeile 107: | Zeile 120: | ||
# Speichere Länderartikel | # Speichere Länderartikel | ||
page.text = str(code) | page.text = str(code) | ||
page.save('Automatische Einbindung der Länder-Infobox ( | page.save('Automatische Einbindung der Länder-Infobox (erste 12 Länder)') | ||
</syntaxhighlight> | </syntaxhighlight> |
Version vom 8. April 2019, 20:07 Uhr
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'
}
# Parameter aus dieser Liste werden nur gefüllt, falls bisher kein Wert enthalten war
preserved_values = {
'Lagekarte',
'Lagebeschreibung'
}
# 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)
# Ersetze Seiteninhalt mit {{Infobox Land}}, falls nicht vorhanden
if not code.filter_templates(matches = lambda n: n.name.matches ('Infobox Land')):
code = mwparserfromhell.parse('{{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:
# Ignoriere auch Parameter, die nicht überschrieben werden sollen
if not (
prop in preserved_values and
code.filter_templates()[0].has(prop) and
code.filter_templates()[0].get(prop).value != ''):
if prop == 'Einwohnerzahl':
ew = float(item[field]['value'])
if ew > 1:
val = f'etwa {locale.format_string("%.0f", ew, grouping = True)} [[Million]]en'
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 Änderungen, falls vorhanden, und verschiebe
# Artikel ggf. zurück in Kategorie "ungeprüfte Infobox"
if page.text != str(code):
# Speichere Vorlage
page.text = str(code)
page.save('Automatische Anlage der Länder-Infobox (erste 12 Länder)')
# Öffne Länderartikel
page = pywikibot.Page(site, title)
code = mwparserfromhell.parse(page.text)
# Binde Länder-Infobox ein, falls noch nicht geschehen
if not code.filter_templates(matches = lambda n: n.name.matches (f'Infobox_{title}')):
code = mwparserfromhell.parse(f'{{{{Infobox_{title}}}}}\n{str(code)}')
# Lösche [[Kategorie:Artikel mit geprüfter Infobox]], falls vorhanden
if '[[Kategorie:Artikel mit geprüfter Infobox]]' in str(code):
code.remove ('[[Kategorie:Artikel mit geprüfter Infobox]]')
# Füge [[Kategorie:Artikel mit ungeprüfter Infobox]] ein, falls noch nicht geschehen
if '[[Kategorie:Artikel mit ungeprüfter Infobox]]' not in str(code):
code.append ('\n[[Kategorie:Artikel mit ungeprüfter Infobox]]')
# Speichere Länderartikel
page.text = str(code)
page.save('Automatische Einbindung der Länder-Infobox (erste 12 Länder)')