Un enregistrement de la résolution des problèmes dans la première moitié du chapitre 3. Comme vous pouvez le voir sur la page Web, le fichier cible est jawiki-country.json, qui est une extension de jawiki-country.json.gz.
Il existe un fichier jawiki-country.json.gz qui exporte les articles Wikipedia dans le format suivant. Les informations sur un article par ligne sont stockées au format JSON Dans chaque ligne, le nom de l'article est stocké dans la clé "title" et le corps de l'article est stocké dans l'objet dictionnaire avec la clé "text", et cet objet est écrit au format JSON. Le fichier entier est gzippé Créez un programme qui effectue le traitement suivant.
Lisez le fichier JSON de l'article Wikipedia et affichez le texte de l'article sur "UK". Dans les problèmes 21-29, exécutez sur le texte de l'article extrait ici.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
import json
inputfile = 'jawiki-country.json'
outputfile = 'jawiki-england.txt'
f = open(inputfile)
g = open(outputfile, 'w')
target = re.compile(u'Angleterre')
for line in f:
res = json.loads(line)
if target.search(res[u'text']):
g.write(res['text'].encode('utf8') + '\n')
f.close()
g.close()
#=> (Fichier jawiki-england.Sortie vers txt)
Utilisez le module re. Puisque le japonais est traité comme une chaîne de caractères Unicode, il est écrit sous la forme «u'UK» ». Compilez en une expression régulière avec la méthode compile du module re et déterminez si chaque ligne contient une cible (UK) avec la méthode de recherche.
Extrayez la ligne qui déclare le nom de la catégorie dans l'article.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_category.txt'
f = open(inputfile)
g = open(outputfile, "w")
category = re.compile('\[\[Category:.+\]\]')
for line in f:
if category.match(line):
g.write(line.strip() + "\n")
f.close()
g.close()
#=> (Fichier jawiki-england_category.Sortie vers txt)
Identique au problème précédent.
Juger s'il faut inclure «[[Category: ~]]».
Échappez à [
et ]
parce que c'est dans une expression régulière.
Extraire les noms des catégories d'articles (par nom, pas ligne par ligne).
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_category-name.txt'
f = open(inputfile)
g = open(outputfile, "w")
category = re.compile('\[\[Category:(.+)\]\]')
for line in f:
l = category.match(line)
if l:
g.write(l.group(1) + "\n")
f.close()
g.close()
#=> (Fichier jawiki-england_category-name.Sortie vers txt)
Obtenez le nom de la catégorie avec la méthode group du module re.
Vous pouvez obtenir la partie modelée par la partie (. +)
Entre parenthèses lors de la compilation de l'expression régulière.
Si l'argument est «0», la totalité de la correspondance est retournée, et s'il s'agit d'une valeur numérique, la partie modelée du nombre est renvoyée (si la valeur numérique est supérieure au nombre de modèles, IndexError est retourné).
Affichez les noms de sections et leurs niveaux contenus dans l'article (par exemple, 1 si "== nom de section ==").
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_section.txt'
f = open(inputfile)
g = open(outputfile, "w")
section = re.compile(r'=(=+) (.+) =')
for line in f:
l = section.match(line)
if l:
g.write("sec%s : " % len(l.group(1)))
g.write(l.group(2) + "\n")
f.close()
g.close()
#=> (Fichier jawiki-england_section.Sortie vers txt)
Comme dans le problème précédent, utilisez la méthode de groupe. Le niveau de section est déterminé par le nombre de «=».
Extrayez tous les fichiers multimédias référencés dans l'article.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import re
inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_media.txt'
f = open(inputfile)
g = open(outputfile, "w")
mediafile = re.compile(r".*(Fichier|File|file):(.*\.[a-zA-Z0-9]+)\|.*")
for line in f:
l = mediafile.match(line)
if l:
g.write(l.group(2) + "\n")
f.close()
g.close()
#=> (Fichier jawiki-england_media.Sortie vers txt)
Identique au problème jusqu'à présent.
J'ai trouvé compliqué d'utiliser le groupe, mais après avoir résolu quelques questions, j'ai en quelque sorte compris.