Eine Aufzeichnung zur Lösung der Probleme in der zweiten Hälfte von Kapitel 3.
Extrahieren Sie die Feldnamen und Werte der im Artikel enthaltenen Vorlage "Basisinformationen" und speichern Sie sie als Wörterbuchobjekt.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
import json
def pass_string(string):
return string
def fundamental_data(file, func):
response = []
data = {}
start = re.compile(r"\{\{Grundinformation")
end = re.compile(r"\}\}")
row = re.compile(r"^\s?\|?\s?(.+?)\s?=(.*)\|?")
flag = False
pre_key = None
for line in file:
if start.match(line):
flag = True
continue
if end.match(line):
flag = False
if flag:
l = row.match(line)
if l:
data[l.group(1).strip()] = func(l.group(2).strip())
pre_key = l.group(1).strip()
else:
m = re.match(r"(.*)\}\}$", line)
if m:
data[pre_key] += func(m.group(1).strip())
flag = False
else:
data[pre_key] += func(line.strip())
else:
if len(data) > 0:
response.append(data.copy())
data.clear()
return response
if __name__ == "__main__":
inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_fundamental.json'
f = open(inputfile)
res = fundamental_data(f, pass_string)
with open(outputfile, 'w') as g:
json.dump(res, g, ensure_ascii=False)
#=> (Datei jawiki-england_fundamental.Ausgabe an json)
Vorlagen für Basisinformationen reichen von {{Basisinformationen
bis }}
.
</ i> Es gab einige Ausnahmen, und es gab Fälle, in denen }}
nicht fehlerhaft war und sich am Ende der Zeile befand, sodass für diesen Teil eine Ausnahmebehandlung durchgeführt wurde. Ich trage es.
(Ich versuche, die Funktion als zweites Argument der Funktion fundamental_data für das folgende Problem zu übergeben.)
Entfernen Sie zum Zeitpunkt der Verarbeitung> 25 das MediaWiki-Hervorhebungs-Markup (alle schwachen Hervorhebungen, Hervorhebungen und starken Hervorhebungen) aus dem Vorlagenwert und konvertieren Sie es in Text (Referenz: Markup-Kurzreferenztabelle).
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
import json
import problem25
def remove_emphasis(string):
emphasis = re.compile(r"''('*)(.+)''\1")
return emphasis.sub(r"\2", string)
if __name__ == "__main__":
inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_fundamental-rmEmpha.json'
f = open(inputfile)
res = problem25.fundamental_data(f, remove_emphasis)
with open(outputfile, 'w') as g:
json.dump(res, g, ensure_ascii=False)
#=> (Datei jawiki-england_fundamental-rmEmpha.Ausgabe an json)
Die Funktion, mit der das hervorgehobene Markup entfernt wird, wird an die im vorherigen Problem erstellte Funktion fundamental_data übergeben. Die "\ number" im regulären Ausdruck repräsentiert das "number" -te Muster, ähnlich der "group" -Methode.
Entfernen Sie zusätzlich zur Verarbeitung von> 26 das interne Link für MediaWiki-Links aus dem Vorlagenwert und konvertieren Sie es in Text (Referenz: Markup-Kurzreferenztabelle).
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
import json
import problem25
import problem26
def remove_internalLink(string):
internallink = re.compile(r"\[\[((.+?)\|)?(.+?)\]\]")
emphasis_removed = problem26.remove_emphasis(string)
return internallink.sub(r"\3", emphasis_removed)
if __name__ == "__main__":
inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_fundamental-rmEmpha-rmLink.json'
f = open(inputfile)
res = problem25.fundamental_data(f, remove_internalLink)
with open(outputfile, 'w') as g:
json.dump(res, g, ensure_ascii=False)
#=> (Datei jawiki-england_fundamental-rmEmpha-rmLink.Ausgabe an json)
Zusätzlich zur Verarbeitung des vorherigen Problems wurde die Verarbeitung hinzugefügt, um das interne Link-Markup zu entfernen.
Entfernen Sie zusätzlich zum> 27-Prozess MediaWiki-Markups so weit wie möglich aus den Vorlagenwerten und formatieren Sie grundlegende Länderinformationen.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
import json
import problem25
import problem26
import problem27
def remove_markup(string):
markups = [
re.compile(r"\[https?://[a-zA-Z0-9\./]+\s(.+)?\]"),
re.compile(r"#REDIRECT\s?(.+)"),
re.compile(r"<!--\s?(.+)\s?-->"),
re.compile(r"\{\{.*[Ll]ang\|[a-zA-Z\-]+\|(.+)\}\}"),
re.compile(r"(.*)<ref.+(</ref>)?>"),
re.compile(r"(.*?)<br\s?/?>"),
re.compile(r"<[a-z]+.*>(.*?)</[a-z]+>")
]
removed_string = problem27.remove_internalLink(string)
for m in markups:
removed_string = m.sub(r"\1", removed_string)
return removed_string
if __name__ == "__main__":
inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_fundamental-rmMUs.json'
f = open(inputfile)
res = problem25.fundamental_data(f, remove_markup)
with open(outputfile, 'w') as g:
json.dump(res, g, ensure_ascii=False)
#=> (Datei jawiki-england_fundamental-rmMUs.Ausgabe an json)
Die gefundenen Markups waren externe Links, Weiterleitungen, Kommentare, Sprachinformationen und HTML-Anweisungen. Daher habe ich eine Funktion hinzugefügt, um sie zu entfernen.
Verwenden Sie den Inhalt der Vorlage, um die URL des Flaggenbilds abzurufen. (Hinweis: Rufen Sie imageinfo in der MediaWiki-API auf, um Dateiverweise in URLs zu konvertieren.)
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import requests
import json
inputfile = 'jawiki-england_fundamental-rmMUs.json'
outputfile = 'jawiki-england_nationalflags.txt'
with open(inputfile, 'r') as f:
template = json.load(f)
wikipedia_api = "http://ja.wikipedia.org/w/api.php?"
prop = {
'action': "query",
'prop': "imageinfo",
'iiprop': "url",
'format': "json",
'formatversion': '2',
'utf8': '',
'continue': ''
}
g = open(outputfile, "w")
for country in template:
if u'Flaggenbild' in country:
countryname = country[u'Kurzbezeichnung']
filename = country[u'Flaggenbild']
prop['titles'] = "Image:" + filename
res = requests.get(url=wikipedia_api, params=prop)
datum = json.loads(res.text)
try:
file_url = datum['query']['pages'][0]['imageinfo'][0]['url']
except:
print(datum)
break
print(filename, file_url)
g.write(countryname.encode('utf8').replace('|', ''))
g.write(", %s\n" % file_url)
g.close()
#=> (Datei jawiki-england_nationalflags.Ausgabe an txt)
Klicken Sie mit dem Anforderungsmodul auf die API.
Recommended Posts