8.7. Mettre les valeurs d’attributs entre guillemets

Une question courante sur comp.lang.python est la suivante : «J’ai plein de documents HTML avec des valeurs d’attributs sans guillemets et je veux les mettre entre guillemets. Comment faire ?»[5] (C’est en général du à un chef de projet qui pratique la religion du HTML-est-un-standard et proclame que toutes les pages doivent passer les tests d’un validateur HTML. Les valeurs d’attributs sans guillemets sont une violation courante du standard HTML). Quelle que soit la raison, les valeurs d’attributs peuvent se voir dotées de guillemets en soumettant le HTML à BaseHTMLProcessor.

BaseHTMLProcessor prend du HTML en entrée (puisqu’il est dérivé de SGMLParser) et produit du HTML, mais le HTML en sortie n’est pas identique à l’entrée. Les balises et les noms d’attributs sont mis en minuscules et les valeurs d’attributs sont mises entre guillemets, quel qu’ait été les format en entrée. C’est de cet effet de bord que nous pouvons profiter.

Exemple 8.16. Mettre les valeurs d’attributs entre guillemets

>>> 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 Notez que la valeur de l’attribut href de la balise <a> n’est pas entre guillemets. (Notez aussi que nous utilisons des triples guillemets pour quelque chose d’autre qu’une doc string et directement dans l’IDE. Elles sont très utiles.)
2 On passe la chaîne au parser.
3 En utilisant la fonction output définie dans BaseHTMLProcessor, nous obtenons la sortie sous forme d’une chaîne unique, avec les valeurs d’attributs entre guillemets. Cela peut sembler évident, mais réfléchissez à tout ce qui s’est passé ici : SGMLParser a analysé le document HTML en entier, le décomposant en balises, références, données etc. ; BaseHTMLProcessor a utilisé tous ces éléments pour reconstruire des pièces de HTML (qui sont encore stockées dans parser.pieces, si vous voulez les voir) ; finalement, nous avons appelé parser.output, qui a assemblé l’ensemble des pièces de HTML en une chaîne.

Footnotes

[5] Bon, en fait ce n’est pas une question si courante. Elle n’est pas aussi courante que «Quel éditeur faut-il utiliser pour écrire du code Python ?» (réponse : Emacs) ou «Python est-il meilleur ou moins bon que Perl?» (réponse : «Perl est moins bon que Python parce que les gens voulaient qu’il soit moins bon.» Larry Wall, 14/10/1998) Mais des questions sur le traitement du HTML apparaissent sous une forme ou l’autre à peu près une fois par mois et parmi ces questions celle-ci est fréquente.