5.7. Virgolettare i valori degli attributi

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.

Esempio 5.15. Valori degli attributi tra virgolette

>>> htmlSource = """        1
...     <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) 2
>>> print parser.output()   3
<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>
1 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.
2 Passiamo la stringa al parser.
3 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.

Footnotes

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