Maison développement back-end Tutoriel Python tutoriel de base python projet trois XML universel

tutoriel de base python projet trois XML universel

Apr 03, 2018 am 09:21 AM
python projet

Cet article présente principalement en détail les trois XML universels du projet de didacticiel de base Python, qui ont une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Le nom de ce projet est appelé XML universel, il est préférable de l'appeler. construire automatiquement un site Web Sur la base d'un fichier XML, un site Web avec une structure de répertoires correspondante est généré. Cependant, seul le HTML est encore trop simple. Il serait plus puissant s'il pouvait également générer du CSS. Cela doit être développé à l’avenir. Étudions d’abord comment structurer le site Web HTML. Étant donné que le site Web est généré via une structure XML, tout doit provenir de ce fichier XML. Regardons d'abord ce fichier XML, website.xml :

<website>
 <page name="index" title="Home page">
 <h1>Welcome to my Home page</h1>
 <p>Hi, there. My name is Mr.gumby,and this is my home page,here are some of my int:</p>
 <ul>
  <li><a href="interests/shouting.html" rel="external nofollow" >Shouting</a></li>
  <li><a href="interests/sleeping.html" rel="external nofollow" >Sleeping</a></li>
  <li><a href="interests/eating.html" rel="external nofollow" >Eating</a></li>
 </ul>
 </page>
 <directory name="interests">
  <page name="shouting" title="Shouting">
   <h1>shouting page</h1>
   <p>....</p>
  </page>
  <page name="sleeping" title="Sleeping">
   <h1>sleeping page</h1>
   <p>...</p>
  </page>
  <page name="eating" title="Eating">
    <h1>Eating page</h1>
    <p>....</p>
  </page>
 </directory>
</website>

Avec ce fichier, voyons comment le générer via ce fichier website .

Nous devons d'abord analyser ce fichier XML. Python analyse XML de la même manière qu'en Java. Il existe deux manières, SAX et DOM. La différence entre les deux méthodes de traitement est la vitesse et la portée. se concentre sur l'efficacité, ne traitant qu'une petite partie du document à la fois, en utilisant la mémoire rapidement et efficacement. Cette dernière est la méthode de traitement opposée, chargeant d'abord tous les documents dans la mémoire, puis le traitement, qui est plus lent et plus consommateur. Le seul avantage de la mémoire est qu'elle peut exploiter l'intégralité du document.

Pour utiliser sax pour traiter du XML en python, vous devez d'abord introduire la fonction d'analyse dans xml.sax et le ContentHandler dans xml.sax.handler. Cette dernière classe doit coopérer avec la fonction d'analyse. . utilisé. L'utilisation est la suivante : parse('xxx.xml',xxxHandler), le xxxHandler ici doit hériter du ContentHandler ci-dessus, mais il suffit d'en hériter, pas besoin de faire quoi que ce soit. Ensuite, lorsque la fonction d'analyse traite le fichier XML, elle appellera la fonction startElement et la fonction endElement dans xxxHandler pour démarrer et terminer la balise en XML. Le processus intermédiaire utilise une fonction nommée caractères pour traiter toutes les chaînes à l'intérieur de la balise.

Avec la compréhension ci-dessus, nous savons déjà comment traiter les fichiers XML, puis examiner le fichier website.xml, la source du mal, et analyser sa structure. Il n'y a que deux nœuds : page. et répertoire. Évidemment, page représente une page et répertoire représente un répertoire.

L'idée de traiter ce fichier XML devient donc claire. Lisez chaque nœud du fichier XML, puis déterminez s'il s'agit d'une page ou d'un répertoire. S'il s'agit d'une page, créez une page HTML, puis écrivez le contenu du nœud dans le fichier. Si un répertoire est rencontré, créez un dossier, puis traitez le nœud de page qu'il contient (s'il existe).
Regardons cette partie du code. L'implémentation dans le livre est plus complexe et flexible. Examinons-le d’abord, puis analysons-le.

from xml.sax.handler import ContentHandler
from xml.sax import parse
import os
class Dispatcher:
    def dispatch(self, prefix, name, attrs=None):
        mname = prefix + name.capitalize()
        dname = &#39;default&#39; + prefix.capitalize()
        method = getattr(self, mname, None)
        if callable(method): args = ()
        else:
            method = getattr(self, dname, None)
            args = name,
        if prefix == &#39;start&#39;: args += attrs,
        if callable(method): method(*args)
    def startElement(self, name, attrs):
        self.dispatch(&#39;start&#39;, name, attrs)
    def endElement(self, name):
        self.dispatch(&#39;end&#39;, name)
class WebsiteConstructor(Dispatcher, ContentHandler):
    passthrough = False
    def __init__(self, directory):
        self.directory = [directory]
        self.ensureDirectory()
    def ensureDirectory(self):
        path = os.path.join(*self.directory)
        print path
        print &#39;----&#39;
        if not os.path.isdir(path): os.makedirs(path)
    def characters(self, chars):
        if self.passthrough: self.out.write(chars)
    def defaultStart(self, name, attrs):
        if self.passthrough:
            self.out.write(&#39;<&#39; + name)
            for key, val in attrs.items():
                self.out.write(&#39; %s="%s"&#39; %(key, val))
            self.out.write(&#39;>&#39;)
    def defaultEnd(self, name):
        if self.passthrough:
            self.out.write(&#39;</%s>&#39; % name)
    def startDirectory(self, attrs):
        self.directory.append(attrs[&#39;name&#39;])
        self.ensureDirectory()
    def endDirectory(self):
        print &#39;endDirectory&#39;
        self.directory.pop()
    def startPage(self, attrs):
        print &#39;startPage&#39;
        filename = os.path.join(*self.directory + [attrs[&#39;name&#39;]+&#39;.html&#39;])
        self.out = open(filename, &#39;w&#39;)
        self.writeHeader(attrs[&#39;title&#39;])
        self.passthrough = True
    def endPage(self):
        print &#39;endPage&#39;
        self.passthrough = False
        self.writeFooter()
        self.out.close()
    def writeHeader(self, title):
        self.out.write(&#39;<html>\n <head>\n  <title>&#39;)
        self.out.write(title)
        self.out.write(&#39;</title>\n </head>\n <body>\n&#39;)
    def writeFooter(self):
        self.out.write(&#39;\n </body>\n</html>\n&#39;)
parse(&#39;website.xml&#39;,WebsiteConstructor(&#39;public_html&#39;))

Il semble que l'analyse ci-dessus de ce programme soit un peu plus compliquée, mais le grand homme Maomao a dit que tout programme complexe est un tigre en papier. Alors analysons à nouveau ce programme.

Tout d'abord, j'ai vu que ce programme avait deux classes. En fait, il peut être considéré comme une seule classe en raison de l'héritage.

Ensuite, regardons ce qu'il contient d'autre. En plus des éléments startElement, endElement et caractères que nous avons analysés, il y a aussi startPage, startDirectory, endDirectory; defaultEnd; ; et expédition, ces fonctions. À l'exception de la répartition, les fonctions précédentes sont faciles à comprendre. Chaque paire de fonctions traite simplement les balises HTML et les nœuds XML correspondants. La répartition est plus compliquée. La complexité réside dans le fait qu'elle est utilisée pour combiner dynamiquement des fonctions et les exécuter.

L'idée de traitement de la répartition est de déterminer d'abord s'il existe une fonction correspondante telle que startPage en fonction des paramètres transmis (c'est-à-dire le nom de l'opération et le nom du nœud). existe, exécutez le nom de l'opération par défaut + : tel que defaultStart.

Après avoir compris chaque fonction une par une, vous saurez à quoi ressemble l'ensemble du flux de traitement. Créez d'abord un fichier public_html pour stocker l'intégralité du site Web, puis lisez les nœuds XML et appelez dispatch via startElement et endElement pour le traitement. Ensuite, il y a la façon dont dispatch appelle la fonction de traitement spécifique. À ce stade, l’analyse de ce projet est terminée.

Le contenu principal à maîtriser est l'utilisation de SAX pour traiter du XML en python, et l'autre est l'utilisation de fonctions en python, comme getattr, les astérisques lors du passage des paramètres...

Connexe recommandé :

Projet de didacticiel de base Python 2 : bonnes images

Projet de didacticiel de base Python 4 : agrégation de nouvelles

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Guide de construction d'Agnes Tachyon | Un joli Musume Derby
2 Il y a quelques semaines By Jack chen
Oguri Cap Build Guide | Un joli Musume Derby
3 Il y a quelques semaines By Jack chen
Péx: comment raviver les joueurs
4 Il y a quelques semaines By DDD
Guide de construction de Grass Wonder | Uma musume joli derby
1 Il y a quelques semaines By Jack chen
Pic comment émoter
3 Il y a quelques semaines By Jack chen

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment gérer l'authentification de l'API dans Python Comment gérer l'authentification de l'API dans Python Jul 13, 2025 am 02:22 AM

La clé pour gérer l'authentification de l'API est de comprendre et d'utiliser correctement la méthode d'authentification. 1. Apikey est la méthode d'authentification la plus simple, généralement placée dans l'en-tête de demande ou les paramètres d'URL; 2. BasicAuth utilise le nom d'utilisateur et le mot de passe pour la transmission de codage Base64, qui convient aux systèmes internes; 3. OAuth2 doit d'abord obtenir le jeton via client_id et client_secret, puis apporter le Bearertoken dans l'en-tête de demande; 4. Afin de gérer l'expiration des jetons, la classe de gestion des jetons peut être encapsulée et rafraîchie automatiquement le jeton; En bref, la sélection de la méthode appropriée en fonction du document et le stockage en toute sécurité des informations clés sont la clé.

Comment analyser les grands fichiers JSON à Python? Comment analyser les grands fichiers JSON à Python? Jul 13, 2025 am 01:46 AM

Comment gérer efficacement les grands fichiers JSON dans Python? 1. Utilisez la bibliothèque IJSON pour diffuser et éviter le débordement de mémoire via l'analyse par éléments par éléments; 2. S'il est au format JSONLINes, vous pouvez le lire ligne par ligne et le traiter avec json.loads (); 3. Ou divisez le grand fichier en petits morceaux, puis le traitez séparément. Ces méthodes résolvent efficacement le problème de limitation de la mémoire et conviennent à différents scénarios.

Python pour la boucle sur un tuple Python pour la boucle sur un tuple Jul 13, 2025 am 02:55 AM

Dans Python, la méthode de traverser les tuples avec des boucles pour les boucles comprend directement itérer les éléments, obtenir des indices et des éléments en même temps, et le traitement des tuples imbriqués. 1. Utilisez la boucle pour accéder directement à chaque élément de séquence sans gérer l'index; 2. Utilisez EnuMerate () pour obtenir l'index et la valeur en même temps. L'indice par défaut est 0 et le paramètre de démarrage peut également être spécifié; 3. Les tuples imbriqués peuvent être déballés dans la boucle, mais il est nécessaire de s'assurer que la structure des sous-tables est cohérente, sinon une erreur de déballage sera augmentée; De plus, le tuple est immuable et le contenu ne peut pas être modifié dans la boucle. Les valeurs indésirables peuvent être ignorées par \ _. Il est recommandé de vérifier si le tuple est vide avant de traverser pour éviter les erreurs.

Comment passer des appels API asynchrones dans Python Comment passer des appels API asynchrones dans Python Jul 13, 2025 am 02:01 AM

Python implémente les appels API asynchrones avec Async / Await avec AIOHTTP. Utilisez Async pour définir les fonctions Coroutine et les exécuter via le pilote asyncio.run, par exemple: asyncdeffetch_data (): AwaitAsyncio.Sleep (1); lancer des demandes HTTP asynchrones via AIOHTTP, et utilisez AsyncWith pour créer des clients de clients et attendre le résultat de la réponse; utiliser asyncio.gather pour emballer la liste des tâches; Les précautions comprennent: éviter les opérations de blocage, ne pas mélanger le code de synchronisation et le jupyter doit gérer les boucles d'événements spécialement. Master Eventl

Qu'est-ce qu'une fonction pure dans Python Qu'est-ce qu'une fonction pure dans Python Jul 14, 2025 am 12:18 AM

Les fonctions pures dans Python se réfèrent à des fonctions qui renvoient toujours la même sortie sans effets secondaires compte tenu de la même entrée. Ses caractéristiques incluent: 1. Le déterminisme, c'est-à-dire que la même entrée produit toujours la même sortie; 2. Pas d'effets secondaires, c'est-à-dire pas de variables externes, pas de données d'entrée et aucune interaction avec le monde extérieur. Par exemple, Defadd (A, B): Returna B est une fonction pure car peu importe le nombre de fois qu'Add (2,3) est appelé, il renvoie toujours 5 sans changer d'autres contenus dans le programme. En revanche, les fonctions qui modifient les variables globales ou modifient les paramètres d'entrée sont des fonctions non-pure. Les avantages des fonctions purs sont: plus faciles à tester, plus adaptés à l'exécution simultanée, les résultats du cache pour améliorer les performances et peuvent être bien adaptés à des outils de programmation fonctionnelle tels que MAP () et Filter ().

Une classe Python peut-elle avoir plusieurs constructeurs? Une classe Python peut-elle avoir plusieurs constructeurs? Jul 15, 2025 am 02:54 AM

Oui, apythonclasscanhavemultipleconstructorshroughalterativetechniques.1.UseaultArgumentsInthe__Init__MethodtoallowflexibleInitializationwithVaryingNumbersofParameters.2.DefineclassMethodsAnterveConstructorForCeleArandScalableableBjectCraturé

Qu'est-ce que si d'autre dans Python Qu'est-ce que si d'autre dans Python Jul 13, 2025 am 02:48 AM

Ifelse est l'infrastructure utilisée dans Python pour un jugement conditionnel, et différents blocs de code sont exécutés par l'authenticité de la condition. Il prend en charge l'utilisation d'ELIF pour ajouter des branches lors du jugement multi-conditions, et l'indentation est la clé de syntaxe; Si num = 15, le programme produit "ce nombre est supérieur à 10"; Si la logique d'attribution est requise, les opérateurs ternaires tels que status = "adulte" ifage> = 18Else "mineur" peuvent être utilisés. 1. Ifelse sélectionne le chemin d'exécution en fonction des conditions vraies ou fausses; 2. ELIF peut ajouter plusieurs branches de condition; 3. L'indentation détermine la propriété du code, les erreurs conduiront à des exceptions; 4. L'opérateur ternaire convient aux scénarios d'attribution simples.

Comment empêcher une méthode d'être remplacée dans Python? Comment empêcher une méthode d'être remplacée dans Python? Jul 13, 2025 am 02:56 AM

Dans Python, bien qu'il n'y ait pas de mot-clé final intégré, il peut simuler des méthodes insurpassables grâce à la réécriture du nom, des exceptions d'exécution, des décorateurs, etc. 1. Utilisez le préfixe de trait de soulignement pour déclencher la réécriture du nom, ce qui rend difficile les sous-classes pour écraser les méthodes; 2. Jugez le type de l'appelant dans la méthode et lancez une exception pour empêcher la redéfinition de la sous-classe; 3. Utilisez un décorateur personnalisé pour marquer la méthode comme final et vérifiez-le en combinaison avec Metaclass ou Decorator de classe; 4. Le comportement peut être encapsulé en tant qu'attributs de propriété pour réduire la possibilité d'être modifiés. Ces méthodes offrent différents degrés de protection, mais aucun d'entre eux ne restreint complètement le comportement de couverture.

See all articles