[Python] Défiez 100 coups! (025-029)

À propos de l'histoire jusqu'à présent

Voir First Post

État de Knock

9/24 ajouté

Chapitre 3: Expressions régulières

Il existe un fichier jawiki-country.json.gz qui exporte les articles Wikipédia au format suivant. ・ Les informations d'un article par ligne sont stockées au format JSON -Dans chaque ligne, le nom de l'article est stocké dans la clé "titre" et le corps de l'article est stocké dans l'objet dictionnaire avec la clé "texte", et cet objet est écrit au format JSON. -Le fichier entier est compressé avec gzip Créez un programme qui effectue le traitement suivant.

025. Extraction de modèles

Extrayez les noms de champ et les valeurs du modèle «informations de base» inclus dans l'article et stockez-les sous forme d'objet dictionnaire.

basic_info_025.py


from training.json_read_020 import uk_find
import re

def basic_info_find(lines):
    pattern1 = re.compile(r'^\{\{[redirect|Informations de base].*')
    pattern2 = re.compile(r'^\|.*')
    pattern3 = re.compile(r'^\}\}$')

    basic_dict = {}
    for line in lines.split('\n'):
        if pattern1.match(line):
            continue

        elif pattern2.match(line):
            point = line.find('=')
            MAX = len(line)
            title = line[0:point].lstrip('|').rstrip(' ')
            data = line[point:MAX].lstrip('= ')
            basic_dict.update({title: data})

        elif pattern3.match(line):
            break
    return basic_dict

if __name__=="__main__":
    lines = uk_find()
    basic_dict = basic_info_find(lines)
    for key,value in basic_dict.items():
        print(key+':'+value)

result


Forme établie 4:Nom du pays actuel "'''Royaume-Uni de Grande-Bretagne et d'Irlande du Nord'''"changer en
Image de l'emblème national:[[Fichier:Royal Coat of Arms of the United Kingdom.svg|85px|Emblème national britannique]]
Lien de l'emblème national:([[Emblème national britannique|emblème national]])
(Omis parce que c'est long)
Process finished with exit code 0

Impression: j'ai extrait la ligne commençant par | du résultat des informations de base et j'ai exécuté une boucle pour la stocker dans la clé et la valeur du dictionnaire avant et après =. Le résultat d'impression a été traité de manière à être facile à comprendre.

026. Suppression du balisage en surbrillance

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).

emphasize_remove_026.py


from training.json_read_020 import uk_find
from training.basic_info_025 import basic_info_find
import re

def emphasize_remove(basic_dict):
    pattern = re.compile(r".*'{2,4}.*")
    for key,value in basic_dict.items():
        if pattern.match(value):
            value = value.replace("\'",'')
            basic_dict.update({key:value})
    return basic_dict


if __name__ == "__main__":
    lines = uk_find()
    basic_dict = basic_info_find(lines)
    emphasize_remove_dict = emphasize_remove(basic_dict)
    for key,value in emphasize_remove_dict.items():
        print(key+':'+value)

result


Statistiques du PIB année yuan:2012
Forme établie 4:Changement du nom de pays actuel "Grande-Bretagne et Royaume-Uni d'Irlande du Nord"
Taille de la zone:1 E11
(Omis parce que c'est long)
Process finished with exit code 0

Impressions: il n'y avait qu'une seule partie pertinente, mais elle est définie sur '{2,4} afin que toutes les balises accentuées puissent être recherchées. Quand je l'ai trouvé, je l'ai juste remplacé par un remplacement.

027. Suppression des liens internes

En plus des 26 processus, 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).

link_remove_027.py


from training.json_read_020 import uk_find
from training.basic_info_025 import basic_info_find
from training.emphasize_remove_026 import emphasize_remove
import re

def link_remove(emphasize_remove_dict):
    pattern = re.compile(r".*\[{2}.*")
    for key,value in emphasize_remove_dict.items():
        if pattern.match(value):
            value = value.replace('[[','').replace(']]','')
            emphasize_remove_dict.update({key: value})
    return emphasize_remove_dict

if __name__=="__main__":
    lines = uk_find()
    basic_dict = basic_info_find(lines)
    emphasize_remove_dict=emphasize_remove(basic_dict)
    link_remove_dict = link_remove(emphasize_remove_dict)

    for key,value in link_remove_dict.items():
        print(key+':'+value)

result


Image de l'emblème national:Fichier:Royal Coat of Arms of the United Kingdom.svg|85px|Emblème national britannique
Nom officiel du pays:{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>Nom officiel du pays autre que l'anglais:<br/>
Forme fondatrice:Fondation du pays
(Omis parce que c'est long)
Process finished with exit code 0

Impressions: Similaire au problème 026, je viens de remplacer [[et]] par replace lorsque j'ai trouvé la partie de lien interne commençant par [[].

028. Suppression du balisage MediaWiki

En plus des 27 processus, supprimez autant que possible les balises MediaWiki des valeurs de modèle et formatez les informations de base sur le pays.

markup_remove_028.py


from training.json_read_020 import uk_find
from training.basic_info_025 import basic_info_find
from training.emphasize_remove_026 import emphasize_remove
from training.link_remove_027 import link_remove
import re

#Une fonction qui supprime les kilos.
def pound_check(value):
    pattern = re.compile(r".*pound.*")
    if pattern.match(value):
        value = value.replace("(&pound;)",'')
        return value
    else:
        return  value

#Une fonction qui supprime la balise br.
def br_check(value):
    pattern1 = re.compile(r".*<br.*")
    if pattern1.match(value):
        value = value.replace("<br />", '').replace("<br/>", '')
        return value
    else:
        return value

#Une fonction qui supprime la balise ref et la description de référence.
def ref_check(value):
    pattern2 = re.compile(r".*<ref.*")
    if pattern2.match(value):
        start_point = value.find("<ref")
        value = value[0:start_point]
        return value
    else:
        return value

#{{Quand}}Fonction à supprimer.
def brackets_check(value):
    pattern3 = re.compile(r".*\{\{.*")
    if pattern3.match(value):
        value = value.replace("{{","").replace("}}","")
        #lang|en|Obtenez 4 caractères ou plus du premier tube lorsque United ~#
        start_point = value.find("|")+4
        value = value[start_point:len(value)]
        return value
    else:
        return value

#Fichier: fonction à supprimer.
def file_check(value):
    pattern4 = re.compile(r".*Fichier.*")
    if pattern4.match(value):
        value = value.replace('Fichier:','')
        start_point = value.find("|")
        value = value[0:start_point]
        return value
    else:
        return value

#Demi-largeur|Fonction à supprimer.|Seulement avec|+()Supprimez le motif existant.
def pipe_check(value):
     pattern5 = re.compile(r".*\|.*")
     pattern6 = re.compile(r".*\(.*")
     if pattern5.match(value) and pattern6.match(value) :
         end_point = value.find("|")
         value = value[0:end_point] + ")"
         return value
     elif pattern5.match(value):
         end_point = value.find("|")
         value = value[0:end_point]
         return value
     else:
         return value

#Pleine largeur (fonction de suppression
def other_check(value):
    pattern7 = re.compile(r"^\(")
    if pattern7.match(value):
        value = value.replace("(","")
        return value
    else:
        return value

def markup_remove(link_remove_dict):
    for key,value in link_remove_dict.items():
        value = pound_check(value)
        value = br_check(value)
        value = ref_check(value)
        value = brackets_check(value)
        value = file_check(value)
        value = pipe_check(value)
        value = other_check(value)
        link_remove_dict.update({key:value})

    return link_remove_dict


if __name__=="__main__":
    lines = uk_find()
    basic_dict = basic_info_find(lines)
    emphasize_remove_dict=emphasize_remove(basic_dict)
    link_remove_dict = link_remove(emphasize_remove_dict)
    markup_remove_dict = markup_remove(link_remove_dict)

    for key,value in markup_remove_dict.items():
        print(key+':'+value)

    print(len(markup_remove_dict.items()))

result


Date de création 1:927/843
Nom officiel du pays:United Kingdom of Great Britain and Northern Ireland
Forme établie 1:Royaume d'Angleterre / Royaume d'Écosse (les deux pays sont une loi de coalition(1707))
Image de position:Location_UK_EU_Europe_001.svg
Slogan:Dieu et mon droit (français:Dieu et mes droits)
ccTLD:.uk / .gb
Image du drapeau:Flag of the United Kingdom.svg
devise:Étang Sterling
(Omis parce que c'est long)
Process finished with exit code 0

Impressions: Tout d'abord, j'ai trouvé le balisage, créé un modèle de compilation et répété pour voir quel type de balisage a été capturé. .. .. Et j'ai décidé d'évaluer tous les modèles ligne par ligne. Cependant, la notation pleine largeur est poire. .. .. Je me demandais vraiment pourquoi il ne s'était pas fait prendre. .. .. Je suis fatigué.

029. Obtenez l'URL de l'image du drapeau

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)

get_url_029.py


# -*- coding:utf-8-*-

from training.json_read_020 import uk_find
from training.basic_info_025 import basic_info_find
import requests
import urllib.parse
import json
import re

def image_query(filename):
    url = "https://commons.wikimedia.org/w/api.php?"
    action = "action=query&"
    titles = "titles=File:"+urllib.parse.quote(filename)+"&"
    prop = "prop=imageinfo&"
    iiprop="iiprop=url&"
    format = "format=json"
    parameter = url +action+titles+prop+iiprop+format
    return parameter

def get_request(parameter):
    pattern = re.compile(r".*\"url\".*")
    r = requests.get(parameter)
    data = r.json()
    json_data =json.dumps(data["query"]["pages"]["347935"]["imageinfo"],indent=4)
    for temp in json_data.split('\n'):
        if(pattern.search(temp)):
            url_data = temp.replace(" ","")
        else:
            continue

    return url_data

if __name__=="__main__":
    lines = uk_find()
    basic_dict = basic_info_find(lines)
    parameter=image_query(basic_dict['Image du drapeau'])
    get_url = get_request(parameter)
    print(get_url)

result


"url":"https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg"

Process finished with exit code 0

Impressions: Au début, je ne savais pas quoi faire. Lorsque j'ai été recherché sur Google de différentes manières, le but était d'envoyer une demande à Wikimedia pour rechercher des données liées au nom du fichier et trouver l'URL où le fichier image est téléchargé à partir de la réponse. Il m'a fallu beaucoup de temps pour comprendre ce sujet ... C'était un problème que j'ai appris de plusieurs façons.

Recommended Posts

[Python] Défiez 100 coups! (015 ~ 019)
[Python] Défiez 100 coups! (006-009)
[Python] Défiez 100 coups! (000-005)
[Python] Défiez 100 coups! (010-014)
[Python] Défiez 100 coups! (025-029)
[Python] Défiez 100 coups! (020-024)
journal des défis python ①
Défiez 100 coups de science des données
Python
Défi Spartacamp Python 2019 Day2
Pandas 100 coups pour les débutants en Python
Défiez Python3 et Selenium Webdriver
Défiez LOTO 6 avec Python sans discipline
Traitement d'image avec la binarisation Python 100 knocks # 3
# 2 Les débutants en Python défient AtCoder! ABC085C --Otoshidama
100 traitement d'image par Python Knock # 2 Échelle de gris
python kafka
Les bases de Python ⑤
Résumé Python
Python intégré
Notation d'inclusion Python
Technique Python
Compte à rebours Python 2.7
Mémorandum Python
Python FlowFishMaster
Service Python
astuces python
fonction python ①
Les bases de Python
Mémo Python
ufo-> python (3)
Notation d'inclusion Python
Installer python
Python Singleton
Les bases de Python ④
Mémorandum Python 2
mémo python
Python Jinja2
100 traitement d'image avec Python Knock # 8 Max Pooling
Incrément Python
atCoder 173 Python
[Python] fonction
Installation de Python
Installer Python 3.4.3.
Essayez Python
Mémo Python
Itératif Python
Algorithme Python
Python2 + mot2vec
[Python] Variables
Fonctions Python
Python sys.intern ()
Tutoriel Python
Fraction Python
underbar python C'est ce que
Résumé Python
Démarrer python
[Python] Trier
Remarque: Python
Les bases de Python ③