Un enregistrement de la résolution des problèmes dans la seconde moitié du chapitre 3.
Extraire les noms de champs et les valeurs du modèle "informations de base" inclus dans l'article et les stocker sous forme d'objet dictionnaire.
# -*- 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"\{\{Informations de base")
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)
#=> (Fichier jawiki-england_fundamental.Sortie vers json)
Les modèles pour les informations de base vont de {{informations de base '' à
}} ''.
</ i> Il y avait quelques exceptions, et il y avait des cas où }}
n'était pas cassé et était à la fin de la ligne, donc la gestion des exceptions a été faite pour cette partie. Je la porte.
(J'essaie de passer la fonction comme deuxième argument de la fonction fondamentale_data pour le problème qui suit)
Au moment du traitement> 25, supprimez le balisage d'accentuation MediaWiki (tous d'accentuation faible, d'accentuation et d'accentuation forte) de la valeur du modèle et convertissez-le en texte (Référence: Tableau de référence rapide du balisage).
# -*- 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)
#=> (Fichier jawiki-england_fundamental-rmEmpha.Sortie vers json)
La fonction qui supprime le balisage en surbrillance est transmise à la fonction fondamentale_data créée dans le problème précédent. Le «\ number» dans l'expression régulière représente le «nombre» modèle, similaire à la méthode «group».
En plus du traitement de> 26, supprimez le balisage du lien interne MediaWiki de la valeur du modèle et convertissez-le en texte (Référence: Tableau de référence rapide du balisage).
# -*- 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)
#=> (Fichier jawiki-england_fundamental-rmEmpha-rmLink.Sortie vers json)
En plus du traitement du problème précédent, ajouté le traitement pour supprimer le balisage de lien interne.
En plus du traitement de> 27, supprimez autant que possible le balisage MediaWiki de la valeur du modèle et formatez les informations de base du pays.
# -*- 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)
#=> (Fichier jawiki-england_fundamental-rmMUs.Sortie vers json)
Les balises trouvées étaient des liens externes, des redirections, des commentaires, des informations linguistiques et des instructions HTML, j'ai donc ajouté une fonctionnalité pour les supprimer.
Utilisez le contenu du modèle pour obtenir l'URL de l'image du drapeau. (Astuce: appelez imageinfo dans l'API MediaWiki pour convertir les références de fichiers en URL)
# -*- 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'Image du drapeau' in country:
countryname = country[u'Nom abrégé']
filename = country[u'Image du drapeau']
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()
#=> (Fichier jawiki-england_nationalflags.Sortie vers txt)
Accédez à l'API à l'aide du module de requêtes.