Parser du HTML avec PHP

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Parser du HTML avec PHP

Re: Parser du HTML avec PHP

par stealth35 » 27 sept. 2010, 11:29

je me suis tromper c'est simplexml_import_dom

Re: Parser du HTML avec PHP

par abelthorne » 27 sept. 2010, 11:20

sinon tu fais un utf8_decode
J'y ai pensé mais j'aimerais autant ne pas toucher à mon contenu et chercher à comprendre d'où vient le problème exactement. ;)
pour le print_r c'est avec dom_import_simplexml
Tu aurais un exemple ? parce que je ne vois pas bien comment l'utiliser pour afficher mon DOM...
Si je pose la question, ce serait surtout pour pouvoir afficher l'arbre DOM complet une fois mon loadHTML effectué, pour voir d'où viennent les domText parasites, ce genre de chose... Donc pas de conversion intermédiaire qui nettoierait le DOM.

Je me disais qu'il y avait peut-être des méthodes __tostring sur les différentes classes qui auraient permis de faire un echo $mon_dom et avoir une arborescence détaillée, mais ce n'est pas le cas. Donc je cherche un équivalent à ça.

Re: Parser du HTML avec PHP

par stealth35 » 27 sept. 2010, 11:04

Ben ça casse tout...

Au passage, il n'y a pas moyen d'afficher facilement le DOM quand on crée un nouvel élément DomDocument ? Un peu à la manière d'un print_r, qui afficherait toute l'arborescence avec le contenu de chaque nœud ?
sinon tu fais un utf8_decode, pour le print_r c'est avec dom_import_simplexml

Re: Parser du HTML avec PHP

par abelthorne » 27 sept. 2010, 10:58

Ben ça casse tout...

Au passage, il n'y a pas moyen d'afficher facilement le DOM quand on crée un nouvel élément DomDocument ? Un peu à la manière d'un print_r, qui afficherait toute l'arborescence avec le contenu de chaque nœud ?

Re: Parser du HTML avec PHP

par stealth35 » 27 sept. 2010, 10:56

juste
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

Re: Parser du HTML avec PHP

par abelthorne » 27 sept. 2010, 10:54

au lieu de faire <?xml encoding="UTF-8"> faut mettre la balise meta
Ah ? Je suivais le conseil d'AB qui parlait d'un hack au début du sujet.

Je mets quoi comme balise meta ? <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> ou <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8"/> (ou les deux) ?
Si je balances la balise à la place du bout de XML, il va bien l'utiliser pour construire le DOM ? Il ne pas pas faire un truc du genre <html><body><meta [...]><p>bla bla</p></body></html> ?

Re: Parser du HTML avec PHP

par stealth35 » 27 sept. 2010, 10:49

au lieu de faire <?xml encoding="UTF-8"> faut mettre la balise meta

Re: Parser du HTML avec PHP

par abelthorne » 27 sept. 2010, 10:43

Euh, oui d'accord mais je ne passe pas un fichier HTML avec entête, etc. Je passe juste du texte formaté en HTML (comme l'exemple que j'ai donné).

$content c'est pas <html><body><p>Un bel été.</p></body></html>, c'est juste <p>Un bel été.</p>

Je travaille sur un petit CMS perso et je stocke en BdD le contenu de mes articles, formaté en HTML (via un champ textarea qui utilise TinyMCE). C'est vraiment du texte formaté, pas un contenu HTML complet et valide...

Re: Parser du HTML avec PHP

par stealth35 » 27 sept. 2010, 10:35

Du contenu HTML

c'est avec la balise meta pour l'encodage :wink:

Re: Parser du HTML avec PHP

par abelthorne » 27 sept. 2010, 10:00

Ce que je passe en paramètre à la fonction ? Du contenu HTML (du genre <p>Un bel été.</p>) récupéré depuis une BdD.

La BdD est en UTF-8, ses champs aussi, je m'y connecte en précisant le charset, j'ai rajouté le header donné plus haut dans mon code et mes fichiers sont en UTF-8. Théoriquement, j'ai de l'unicode de bout en bout.

Re: Parser du HTML avec PHP

par stealth35 » 27 sept. 2010, 09:51

a quoi correspond $content ?

Re: Parser du HTML avec PHP

par abelthorne » 27 sept. 2010, 09:22

Bonjour,
Je suis de nouveau sur mon problème de "parseage" HTML (je l'avais un peu mis de côté) et j'ai un questionnement qui se rajoute.

Voici mon code actuel :
function explode_content($content){
    $table=array();

    $dom=new DomDocument();
    $dom->loadHTML('<?xml encoding="UTF-8">'.$content);
    foreach($dom->documentElement->firstChild->childNodes as $node){
        if($node->nodeType===XML_ELEMENT_NODE){
            if($node->hasAttribute('id')){
                $tmp=new DomDocument();
                foreach($node->childNodes as $subnode) $tmp->appendChild($tmp->importNode($subnode,true));
                $id=$node->getAttribute('id');
                $table[$id]['id']=$id;
                $table[$id]['type']=$node->nodeName;
                $table[$id]['content']=$tmp->saveHTML();
            }
        }
    }
    return $table;
}
Je passe un contenu HTML (récupéré depuis une BdD) à ma fonction qui me le rend "découpé" et stocké dans un tableau.

À la base, mon contenu est tout en UTF-8, stocké "en clair" (pas d'entités HTML). Dans le tableau que je récupère après la fonction, le contenu de mes balises a été converti (caractères accentués remplacés par des entités mais pas les balises elles-mêmes). Je suppose que ça vient du passage par le DomDocument temporaire, soit au moment des appendChild ou du saveHTML. De plus, si je décode le contenu avec html_entity_decode($tmp->saveHTML()); je me retrouve avec du texte encodé en ISO.

Est-ce que c'est normal ? Le DOM travaille forcément en convertissant les caractères spéciaux en entités ? Comment modifier mon code pour que le DOM temporaire (qui sert à récupérer le contenu de mes balises avec le code, suggéré par stealth35 ci-dessus) travaille en UTF-8 ?

Au passage, j'ai dû rajouter un test sur le type des nœuds lorsque je traite le contenu : pour une raison qui m'échappe, depuis que j'ai corrigé le contenu des champs de ma BdD pour virer toutes les entités HTML (j'ai donc du texte en UTF-8), je me retrouve avec des nœuds domText qui viennent je ne sais d'où. Avant, si mon contenu était "&eacute;t&eacute;", le charger avec loadHTML me donnait un domElement. Maintenant que mon contenu est "été", je me retrouve avec un domElement + un domText.

Re: Parser du HTML avec PHP

par AB » 08 sept. 2010, 20:38

De vieilles habitudes de programmation ...
Je faisais comme toi aussi avant... :)

Puis à force de voir du code et les accolades bien indentées et donc plus lisibles (surtout à l'intérieur des fonctions ou méthodes), je me suis laissé tenter par plus de clarté et le petit temps supplémentaire que ça me prend est amorti dès la première relecture...

Oui bon chacun fait comme il veut, c'était juste pour causer :)

Re: Parser du HTML avec PHP

par abelthorne » 07 sept. 2010, 20:20

Pas certain que tu puisse t'en passer. Apache risque de t'envoyer par défaut des entêtes au format ISO... à tester.
Ok, je verrai ça. De toute façon, pour l'instant, ce sont surtout des tests un peu empiriques. Mon génial système de publication n'est pas encore bien défini.
Décidément je suis un peu approximatif aujourd'hui :? Je voulais parler des accolades... :)
De vieilles habitudes de programmation qui datent de mon apprentissage du C il y a 15 ans. Mon prof les mettait comme ça. Je suis complètement paumé et je trouve le code illisible si je change les accolades de place, si je mets des espaces, etc. ;)

Re: Parser du HTML avec PHP

par AB » 07 sept. 2010, 20:10

Il y a effectivement une méthode de DOMNode qui est hasAttributes(void) (au pluriel) et qui ne prend pas de paramètres (on vérifie si le nœud a des attributs), mais il y a aussi hasAttribute(string) (au singulier) qui vérifie la présence de l'attribut en paramètre. Celle-ci fait partie des méthodes de DomElement.
Ah oui j'ai cité ton code (hasAttribute) en pensant au miens (hasAttributes) :?
- Si tu utilises le hack '<?xml encoding="UTF-8">' dans loadHTML, n'oublies pas au paravant de spécifier l'entête header('Content-type: text/html; charset=UTF-8');
Je l'avais rajouté pour tester, mais ça m'arrange pas dans l'immédiat de rajouter des headers (mon code est un peu bordélique). Est-ce que je peux faire l'impasse sur l'encoding et le content-type, sachant que mes fichiers sont en UTF-8, ma base MySQL aussi, et ma connexion à cette dernière aussi ?
Pas certain que tu puisse t'en passer. Apache risque de t'envoyer par défaut des entêtes au format ISO... à tester.
Mais il est parfaitement indenté, mon code... 8-)
Décidément je suis un peu approximatif aujourd'hui :? Je voulais parler des accolades... :)