IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[PHP] Parser d'une page HTML pour récupération du texte


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut [PHP] Parser d'une page HTML pour récupération du texte
    Bonjour,

    Je souhaiterais à partir d'un fichier HTML, extraire tout le texte qui existe sur la page. Est-ce qu il y a des algos, des fonctions que vous me conseillez pour faire cela?

    A titre d'exemeple, si j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <head>
    <title> mon site </title></head>
    <body> ok </body>
    Et après, mettre dans un fichier :
    mon site
    ok

    Je pensais essayer de détecter tous les textes entre "> < ". Est-ce une bonne idée?

  2. #2
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Il semblerait que la meilleure solution soit d'utiliser les expressions régulières avec preg_match?

    Quelqu'un peut me confirmer ca? faut que je regarde cmt s'utilise cette fonction

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    Sinon, tu as tidy, si l'extension est installée sur ton serveur :

    http://fr2.php.net/manual/fr/function.tidy-get-body.php

  4. #4
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Non elle ne l'est pas

    J'ai une question sur l'utilisation des expression regulières la...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $filehandle=fopen('index.html','r');
     
    while(!feof($filehandle))
    {
      $line.=fgets($filehandle, 500); // Max 500 chars
     
    }
      $titre = eregi("<title>(.*)</title>",$line,$regs);
     
    echo $regs[0];
    Je pensais que ca le résultat allait être le contenu du titre sans les balises mais ce n'est pas le cas.. comment on peut récupérer juste ce qu il y a entre les balises<title> et </title> avec une expression régulière?

    merci

  5. #5
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Bonjour,

    mmm j'ai du mal avec les expressions régulières :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <META NAME="description" CONTENT="Publicit&eacute; on line, Bases de donn&eacute;es, commerce &eacute;lectronique ? Adverland : un interlocuteur unique pour mon&eacute;tiser votre audience">
    <META NAME="keywords"  CONTENT="r&eacute;seau,publicit&eacute;,campagne publicitaire,CPM,campagnes,annonceur,annonceurs,editeurs,&eacute;diteurs, publicitaires,rentabilisez,rentabiliser,rentabilise,publicit&eacute; on line,bases de donn&eacute;es,commerce &eacute;lectronique,audience,r&eacute;gie, online,publicite, marketing,emailing,e-mailing, wap, banniere,bannière,affiliation,reseau,regie,CB ,carte bleue,sms,sms+,wh,w-ha,audiotel,micropaiement">
    <META NAME="classification"  CONTENT="REGIE PUBLICITAIRE,MARKETING,COMMERCE ELECTRONIQUE,AFFILIATION">
    je souhaiterais récupérer ce qu'il y a après le content, entre les guillemets
    j'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eregi("<META NAME=\"description\"(.*)CONTENT=\"(.*)>(\n\r)$",$line,$metadesc);
    pour description par exemple mais marche pas tres bien

    Si je retire le \n\r$ je récupère plus d'une ligne :s

    Je continue de regarder mais si quelqu'un peut m'aider

    Merci

  6. #6
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    J'ai plus ou moins résolu le problème des metas en supposant qu'une page est bien écrite c'est à dire que c'est de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <Meta name = ...>
    <Meta Name = >
    Mon problème vient maintenant du texte dans le body... Ce que je faisais pour les métas, c'est de tester en lisant le fichier avec file() mais la je ne pourrai pas dans le body...

    Je suis, il me semble, obligé de garder tout ce qu il y a entre <body> et </body>

    Ensuite, j'aurai bien voulu, dans un premier temps, repéré ce qui se trouve entre <td...>texte</td>

    J'ai donc fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eregi("<td(.*)>(.*)(</td>?)",$text,$regtext);
    Je voulais qu'il me récupère que la première fermeture du td... Or la, je récupère tout jusqu au dernier </td> de ma page... Je me suis trompé qq part dans l'expression je suppose

    Merci!

  7. #7
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("#<td[^>]*>(.*)</td>#Ui",$texte,$resultat);
    Voila !! il vaut mieux utiliser les PCRE (donc preg_) que les ereg_

  8. #8
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Merci

    J'ai changé mon fusil d'épaule entre temps en fait

    Je vais récupérer tout ce qu il y a entre les '>' et '<'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /* if(preg_match_all('|>[^<]+<|i',$text,$matches))*/
    qui se trouve entre <body> et </body>
    mais bon j'ai l'impression que j'ai un petit prob :d
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match_all('|<body[^>]*>[^</body>]*</body>|i',$text,$matches));

  9. #9
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#<body[^>]*>.*</body>#i',$text,$matches);
    le ^ c est pour un seul caractere. et sinon je sais pas si c est super a utiliser dans un if.

  10. #10
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    oui c'est vrai que le if pas tres utile pour le moment

    Merci pour le ^

    Question... Ca existe un preg_match_all insensible à la casse? Parce que je suppose que si un site mais <BODY> a la place de <body> mon script va pas apprécié :s

  11. #11
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    ca donne insensible à la casse ...

    et sinon pour connaitre les autres : http://fr.php.net/manual/fr/referenc....modifiers.php

    Voila !!

  12. #12
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Merci

    Heu ... mm comment dire, petit soucis ... je récupère beaucoup trop d'espace .

    c'est à dire que j'ai des choses comme :

    mon texte texte2

    il y a une fonction qui supprime les espaces en trop ? ou je dois l écrire moi meme :s

  13. #13
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    trim()

  14. #14
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Merci maître Maxoo

  15. #15
    Membre régulier Avatar de ikeaboy
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par Maxoo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#<body[^>]*>.*</body>#i',$text,$matches);
    le ^ c est pour un seul caractere. et sinon je sais pas si c est super a utiliser dans un if.
    Bonjour,

    Ici $text représente quoi? c'est bien le chemin du fichier non?

    Faut il encore utiliser le code d'ouverture la ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $filehandle=fopen('index.html','r');
     
    while(!feof($filehandle))
    {
      $line.=fgets($filehandle, 500); // Max 500 chars
     
    }
      $titre = eregi("<title>(.*)</title>",$line,$regs);
     
    echo $regs[0];
    Merci pour les renseignements

  16. #16
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Bien sur il faut que tu ouvres quand meme ton fichier,
    tu récuperes tout dans $line, tu passes le regexp sur $line, et apres tu vois dans $matches ou se cachent les bon résultats ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $filehandle=fopen('index.html','r');
    $line = "";
    
    while(!feof($filehandle))
    {
      $line.=fgets($filehandle, 500); // Max 500 chars
    
    }
    
    preg_match_all('#<body[^>]*>.*</body>#i',$line,$matches);
    
    print_r($matches);;

  17. #17
    Membre régulier Avatar de ikeaboy
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Points : 109
    Points
    109
    Par défaut
    oui en effet ca fonctionne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    //Ouverture du fichier
    						$line="";	
    						$filehandle=fopen($filename,'r');
     
    								while(!feof($filehandle))
    								{
      									$line.=fgets($filehandle,500); // Max 500 chars
     
    								}
     
     
    						preg_match_all('#<span[^>]*>.*</span>#i',$line,$matches);
     
    							foreach ($matches as $val){
    								echo $val[0]."<br/>";
    								echo $val[1]."<br/>";
    								echo $val[2]."<br/>";
    								echo $val[3]."<br/>";
    								echo $val[4]."<br/>";
    							}
    J'ai ajouté l'inisalisation de $line

    EDIT : je n avais pas vu ton message je corrige mon initialisation

    EDIT2 : très pratique le print_r on voit la position dans le tableau c'est très pratique

    Merci

  18. #18
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    sujet résolu ?

  19. #19
    Membre régulier Avatar de ikeaboy
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Points : 109
    Points
    109
    Par défaut
    Oui résolu merci

    Désolè j avais oublié

  20. #20
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Désolé si je réveille un peu les morts, mais ce message m'a intéressé, donc je complète, ou plutôt j'actualise :

    Il n'est pas nécessaire de parser le fichier ligne à ligne, mais on peut simplement utiliser la fonction file_get_contents, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // Charger le fichier dans une variable
    // NB: penser à remettre pointeur à zéro si nécessaire
    $load_response = file_get_contents(CURL_RESPONSE);
     
    // Optionnel: Conversion des fins de ligne dos2unix
    $html_contents = preg_replace('/(\r\n|\r|\n)/s',"\n",$load_response);
    $html_contents = trim($html_contents);
     
    // Et voila les patterns que vous pouvez tester - à adapter selon votre cas de figure
    $patterns= array('#.*(foo.*=.*);.*#i',
    			"#[\s]{0,}([\w\.]{0,}[\s]?bar.*=.*);.*#i"
    		);
     
    foreach ( $patterns as $pattern) {
    	preg_match_all($pattern,  $html_contents, $matches);
    	echo "<b>PATTERN $pattern</b>";
    	echo '<pre>'; print_r($matches); echo '</pre>';
    }
    Le principe à adapter aux besoins de chacun bien sûr.

    Et à noter qu'il existe maintenant de bons parsers HTML (exemple $html = new DOMDocument(); ).

    Voila.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [WD18] Parser une page HTML pour récupérer certaines données.
    Par Khyinn dans le forum WinDev
    Réponses: 3
    Dernier message: 06/01/2015, 21h35
  2. [PHP-JS] Créer une page html avec PHP5
    Par kaiser59 dans le forum Langage
    Réponses: 23
    Dernier message: 29/01/2008, 17h38
  3. Réponses: 1
    Dernier message: 28/07/2007, 20h19
  4. Parser une page Html pour récuperer valeur
    Par Andry dans le forum Delphi
    Réponses: 5
    Dernier message: 01/12/2006, 17h10
  5. parser une page HTML pour en retirer de l'info
    Par belakhdarbts10 dans le forum ASP
    Réponses: 1
    Dernier message: 29/10/2006, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo