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 = """
... <html>
... <head>
... <title>Test page</title>
... </head>
... <body>
... <ul>
... <li><a href=index.php>Home</a></li>
... <li><a href=toc.php>Table of contents</a></li>
... <li><a href=history.php>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.php">Home</a></li>
<li><a href="toc.php">Table of contents</a></li>
<li><a href="history.php">Revision history</a></li>
</body>
</html>
|
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.)
|
|
On passe la chaîne au
parser.
|
|
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.
|