Bonjour

J'ai plusieurs centaines de pages HTML auxquelles je voudrais appliquer des modifications importante: en gros, récupérer le contenu sémantique et créer de nouvelles pages structurées différemment avec le même contenu sémantique.
L'approche est de travailler sur le DOM de la page.
Pour faire cela j'ai exploré deux voies:
1) en JavaScript, il est assez simple de travailler sur le DOM, mais cette opération est trop longue à effectuer pour qu'on puisse le faire à chaque chargement de page. Le problème est de sauvegarder le résultat dans un fichier.
2) je pensais m'en sortir en PHP, en utilisant la fonction DOMDocument::loadHTMLFile() et en travaillant sur le DOM résultant, mais je découvre que cette fonction ne génère pas de structure correcte, en particulier si le fichier HTML est déjà en HTML5 (!!!)

Avant de me lancer dans le développement d'un analyseur en local sur PC ou en PHP sur serveur, j'aimerais bien votre avis sur le sujet.

Merci de vos conseils.
PapyJP a écrit :
Bonjour

J'ai plusieurs centaines de pages HTML auxquelles je voudrais appliquer des modifications importante: en gros, récupérer le contenu sémantique et créer de nouvelles pages structurées différemment avec le même contenu sémantique.
L'approche est de travailler sur le DOM de la page.
Pour faire cela j'ai exploré deux voies:
1) en JavaScript, il est assez simple de travailler sur le DOM, mais cette opération est trop longue à effectuer pour qu'on puisse le faire à chaque chargement de page. Le problème est de sauvegarder le résultat dans un fichier.
2) je pensais m'en sortir en PHP, en utilisant la fonction DOMDocument::loadHTMLFile() et en travaillant sur le DOM résultant, mais je découvre que cette fonction ne génère pas de structure correcte, en particulier si le fichier HTML est déjà en HTML5 (!!!)

Avant de me lancer dans le développement d'un analyseur en local sur PC ou en PHP sur serveur, j'aimerais bien votre avis sur le sujet.

Merci de vos conseils.

Si tes pages sont en XHTML ou peuvent être converties en XML assez facilement, tu as aussi la possibilité d'utiliser les transformation XSLT (tutoriel).
Pas forcément facile à maîtriser et parfois à la limite de l'ésotérisme, mais particulièrement puissant pour convertir un document d'un format vers un autre...
@sepecat
Si c'était le cas, je n'aurais effectivement pas ce genre de problème.
La fonction DOMDocument::loadHTMLFile() est sensée faire cela à partir d'un fichier HTML bien fait, ou même pas très bien fait, comme le font les navigateurs (car si ce n'était pas le cas, combien de pages pourrions nous voir effectivement?). Sauf que je découvre que cette fonction ne marche pas très bien et que je n'arrive pas à retrouver mes petits.
Modérateur
Si tu as une solution JavaScript qui fonctionne et que tu manques de temps, tu peut éventuellement la lancer au chargement de la page encore non modifiée, et renvoyé cette transformation au serveur qui peut alors se chargé de mettre à jour coté serveur tes modifications.
Une visite suffirais alors à mettre à jour la page ... et tes visiteurs peuvent y contribué sans que tu ai à faire tout le site d'un coup (une visite=mise a jour).
Modifié par gcyrillus (11 Jun 2016 - 14:25)
Pour donner quelques exemples de ce qui cloche dans cette fonction:

1 - DOMDocument::loadHTMLFile(): htmlParseEntityRef: expecting ';'
En fait il s'agit d'un lien
<a href="http://dsc.discovery.com/news/2007/02/08/egyptgod_his_02.html?category=travel&guid=20070208150030" target="_blank" class="vues">
le ";" qui manque prétendument est dû au fait que le lien comporte &guid= et que bien entendu il n'y a pas de ";" pour fermer le "&" !!

2- DOMDocument::loadHTMLFile(): Tag main invalid
DOMDocument::loadHTMLFile(): Tag header invalid
DOMDocument::loadHTMLFile(): Tag article invalid
Tout simplement il ne reconnait pas les balises HTML5!

Le pire est que dans le 2ème cas (HTML5) la fonction se plante, alors que ce devrait au plus être un warning!
Modifié par PapyJP (11 Jun 2016 - 14:24)
PapyJP a écrit :
@sepecat
Si c'était le cas, je n'aurais effectivement pas ce genre de problème.
La fonction DOMDocument::loadHTMLFile() est sensée faire cela à partir d'un fichier HTML bien fait, ou même pas très bien fait, comme le font les navigateurs (car si ce n'était pas le cas, combien de pages pourrions nous voir effectivement?). Sauf que je découvre que cette fonction ne marche pas très bien et que je n'arrive pas à retrouver mes petits.

Si Java ne te fais pas peur Smiley biggrin , tu peux utiliser un analyseur tel que jsoup pour balayer toutes les pages existantes et les sérialiser à nouveau dans un format "propre", que tu puisses ensuite manipuler aisément via javascript / DOM.
J'avais utilisé cet analyseur à une époque pour des besoins au boulot et il ne fonctionnait pas trop mal, notamment lors de la récupération de documents HTML "bancals" dans lesquels certaines balises étaient montées de façon un peu acrobatique (non fermées, attributs bizarres, etc.).
Ce pourrait être une solution pour pré-formater l'existant...
PapyJP a écrit :
Pour donner quelques exemples de ce qui cloche dans cette fonction:
1 - DOMDocument::loadHTMLFile(): htmlParseEntityRef: expecting ';'
En fait il s'agit d'un lien
<a href="http://dsc.discovery.com/news/2007/02/08/egyptgod_his_02.html?category=travel&guid=20070208150030" target="_blank" class="vues">

le ";" qui manque prétendument est dû au fait que le lien comporte &amp;guid= et que bien entendu il n'y a pas de ";" pour fermer le "&" !!
2- DOMDocument::loadHTMLFile(): Tag main invalid
DOMDocument::loadHTMLFile(): Tag header invalid
DOMDocument::loadHTMLFile(): Tag article invalid
Tout simplement il ne reconnait pas les balises HTML5!
Le pire est que dans le 2ème cas (HTML5) la fonction se plante, alors que ce devrait au plus être un warning!

C'est quand je vois des problèmes pareils que je me dis que transformer systématiquement les valeurs d'attributs en entités n'est pas inutile (cf. mon commentaire sur un autre sujet du forum)... Smiley ohwell
Nouvelles du front à 15h15, au moment où je dois sortir:

Une fois enlevé les Warnings intempestifs (et heureusement, il semble que ce ne soient que des Warnings) j'arrive à retrouver mon HTML dans un objet DOMDocument en PHP, à le modifier et à le sauver dans un fichier.
Je vais donc poursuivre dans cette direction.

Je vous tiendrai au courant de la suite.... Smiley smile