J'essaie de lire un fichier HTML uniquement dans un bloc spécifique (modèle jinja) en python. Je veux lire entre {% block content%} et son {% endblock%} correspondant.

Je recherche {{et {% entre les blocs et je veux imprimer le numéro de ligne et le contenu de la ligne où je trouve les modèles de recherche.

J'enregistre le chemin du fichier dans une variable et l'utilise pour ouvrir le fichier quand j'ai besoin. J'utilise la fonction énumérer pour garder une trace du numéro de ligne.

fp = r"<path_to_HTML_file>"

def scan(line_number, line, flag):
    with open(fp, 'r', encoding='utf-8') as f:
        for check_line_number, check_line in enumerate(f, 1):
            if check_line_number >= line_number:
                if '{%' in check_line:
                    print("Line Number: {}\nContent: {}".format(check_line_number, check_line))


with open(fp, 'r', encoding='utf-8') as f:
    for line_number, line in enumerate(f, 1):
        if '{% block content %}' in line:
            flag = 1
            scan(line_number, line, flag)

Le problème auquel je suis confronté est que mon code imprime toutes les occurrences de {% présentes après {% block content%}, mais je veux lire jusqu'au {% endblock%} correspondant.

De plus, je ne sais pas où fermer le fichier.

0
Ayodele Ashad 3 nov. 2019 à 13:58

1 réponse

Ce problème pourrait être facilement résolu à l'aide d'expressions régulières.

import re

# blocks will be a list of the contents of the blocks in the string FILE_CONTENTS
blocks = re.findall(r'{% block \w+? %}(.*?){% endblock %}', FILE_CONTENTS, re.S)

Je vous suggère fortement de lire les schémas d'expression rationnelle. Ils sont assez pratiques.

0
Maxxik CZ 3 nov. 2019 à 11:10