You are here: Partenza > Dive Into Python > Elaborare HTML > Virgolettare i valori degli attributi | << >> | ||||
Dive Into PythonPython per programmatori esperti |
Una domanda ricorrente su comp.lang.python è: “Io ho un gruppo di documenti HTML con i valori degli attributi espressi senza virgolette e voglio virgolettarli tutti in maniera opportuna. Come posso farlo?” [10] (Questa situazione è generalmente causata da un responsabile di progetto, convertito alla religione “HTML è uno standard”, che si aggiunge ad un grosso progetto e annuncia che tutte le pagine HTML devono essere validate da un verificatore di HTML. Avere i valori degli attributi senza virgolette è una violazione comune dello standard HTML.) Qualunque sia la ragione, è facile rimediare ai valori degli attributi senza virgolette, se si filtra il documento HTML attraverso BaseHTMLProcessor.
La classe BaseHTMLProcessor consuma codice HTML (giacché discende da SGMLParser) e produce codice HTML equivalente, ma il codice di uscita non è identico a quello di entrata. Tag e nomi di attributi sono generati in carattere minuscoli, anche se erano inizialmente in caratteri maiuscoli o misti maiuscolo/minuscolo; i valori degli attributi sono racchiusi tra virgolette, anche se erano originariamente racchiusi tra apici o non avevano affatto delimitatori. È quest'ultimo effetto collaterale che noi possiamo sfruttare.
>>> htmlSource = """ ... <html> ... <head> ... <title>Test page</title> ... </head> ... <body> ... <ul> ... <li><a href=index.html>Home</a></li> ... <li><a href=toc.html>Table of contents</a></li> ... <li><a href=history.html>Revision history</a></li> ... </body> ... </html> ... """ >>> from BaseHTMLProcessor import BaseHTMLProcessor >>> parser = BaseHTMLProcessor() >>> parser.feed(htmlSource) >>> print parser.output() <html> <head> <title>Test page</title> </head> <body> <ul> <li><a href="index.html">Home</a></li> <li><a href="toc.html">Table of contents</a></li> <li><a href="history.html">Revision history</a></li> </body> </html>
Va notato che i valori degli attributi href nei tag <a> non sono virgolettati in modo proprio. Va anche notato che stiamo usando le virgolette triple per qualcosa di diverso da una docstring, e direttamente nell'interprete interattivo (IDE ndt) per giunta. Le triple virgolette sono utili per molte cose. | |
Passiamo la stringa al parser. | |
Usando la funzione di output definita in BaseHTMLProcessor, otteniamo l'output come una singola stringa, inclusi i valori degli attributi racchiusi tra virgolette. Sebbene tutto ciò possa apparire ben poco sensazionale, si pensi a quante cose sono effettivamente successe a questo punto: SGMLParser ha processato l'intero documento HTML e lo ha scomposto in tag, riferimenti, dati, e così via; BaseHTMLProcessor ha usato questi elementi per ricostruire pezzi di HTML ( che sono ancora memorizzati in parser.pieces, nel caso li vogliate vedere); finalmente, è stato chiamato il metodo parser.output, che ha ricomposto tutti gli elementi HTML in un'unica stringa. |
[10] Daccordo, non è poi una domanda così comune. Non allo stesso livello di “Quale editor conviene usare per scrivere codice Python?” (risposta: Emacs) oppure “Python è migliore o peggiore di Perl?” ( risposta: “Perl è peggiore di Python perché la gente lo ha voluto peggiore.” - Larry Wall, 14/10/1998). Ma comunque domande sull'elaborazione di testo HTML spuntano fuori in una forma o nell'altra circa una volta al mese e tra queste domande una delle più gettonate è quella che ho citato.
<< Formattazione di stringhe basata su dizionario |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
Introduzione al modulo dialect.py >> |