#1 22-03-2008 10:39:20

Toucouleur
Survivors
Lieu: Perpignan
Date d'inscription: 30-09-2005
Messages: 790
Site web

Extraction texte en fonction de balise HTML avec Preg_match_all

J'ai avec les conseils de françois commencé à réétudier post journée habituelle les expressions régulières pour faire de l'extraction d'infos sur certains pages Web.

Mais tout ne marche pas facillement vace ces foutus expressions.

Après avoir passé rien que quelques heures pour comprendre le minimum syndical, j'ai pondu ça :

Code:

$string = file_get_contents($url_to_get_content_from);

function findinside($start, $end, $string) {
        preg_match_all('/' . preg_quote($start, '/') . '([^\.)]+)' . preg_quote($end, '/').'/i', $string, $m);
        return $m[1];
    }
   
    $start = "<b>";
    $end = "</b>";

    $out = findinside($start, $end, $string);

    print_r ($out);

ça fonctionne très bien avec $start (= '<b>') et $end ( ='</b>') qui sont simple.

Mettons que mon texte de départ soit

$string soit :

Code:

<tr>    <td bgcolor=#DDDDDD colspan=10>    <big><b>Info à pomper
            2ième ligne d'info
            alors ?</b></big>
    </td>
</tr>
<tr>
        <td valign="top" align="center">
            <img src="documents\totoula\755990169-g.jpg" border=0 alt="Photo 755990169-g.jpg" title="755990169 : test image">

et que je spécifis plutot dans $start et $end

Code:

$start = '<td bgcolor=#DDDDDD colspan=10>    <big><b>';
$end = '</b></big>
    </td>';

ça ne fonctionne plus du tout.

Vous l'avez compris je cherche à me fabriquer une fonction pour extraire à des endroits b ien précis dans le code des données.

J'ai passé des heures http://osteele.com/tools/rework/ si quelqu'un possède la fonction universelle et qui fonctionne (presque ) à tous les coup, je suis preneur!


"Le luxe est naturellement associé à la richesse qui permet des investissements qui visent le pur agrément et non le profit."

Hors ligne

 

#2 22-03-2008 11:16:37

fbparis
Survivors
Lieu: Paris
Date d'inscription: 14-07-2006
Messages: 1896
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

je mettrais plutot /si a la fin de ta regex plutot que /i : si avec les retours a la ligne ca va coincer..

Pour ta regex perso j'aurais plutot vu ca (je pige pas trop la partie entre les preg_quote la) :

Code:

preg_match_all('/' . preg_quote($start, '/') . '(.*?)' . preg_quote($end, '/').'/si', $string, $m);

Derni�re modification par fbparis (22-03-2008 11:53:10)

Hors ligne

 

#3 22-03-2008 11:59:44

Siddartha
Administrateur
Lieu: Paris et #66valley ☼
Date d'inscription: 20-06-2005
Messages: 2988
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Pkoi pas utiliser les fonctions DOM de php5 plutôt que des expregs relativement complexes ?

C'est quand même dingue de faire compliqué quand on peut faire simple big_smile

Code:

$url = 'http://www.tonsuperdnsaparser.com/Airport/airportDetails.jsp?airportCode='.$getIata;
echo $url;
$dom = new Domdocument();
@$dom->loadHTMLFile($url);

for ($i=0;$i<15;$i++ ){
  echo $i . "->" . $dom->getElementsByTagName('b')->item($i)->textContent ."<br />";
}

le $i = 15 est juste un exemple puisque j'avais compté les b et seuls les 15 premiers m'intéressait dans ce cas. Si ensuite, la donnée que tu cherches est dans le 3 eme <b> du DOM, ben :

Code:

$iata_tmp = $dom->getElementsByTagName('b')->item('3')->textContent;

Et probleme réglé en 5 lignes de codes.
Et ca marche pour tout élèment présent dans le dom !!
Je comprends pas pourquoi vous vous faites chier encore avec des expregs !

Hors ligne

 

#4 22-03-2008 12:02:57

fbparis
Survivors
Lieu: Paris
Date d'inscription: 14-07-2006
Messages: 1896
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Ouais mais comme tu l'as dit Sid c'est du PHP 5... Et ya encore pas mal de sites qui n'ont pas migré.

Hors ligne

 

#5 22-03-2008 12:27:16

Siddartha
Administrateur
Lieu: Paris et #66valley ☼
Date d'inscription: 20-06-2005
Messages: 2988
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Bah tlm a php5 non now ?
Et en particulier Toucouleur ! ;-)

Hors ligne

 

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/tgarchive/forum/include/parser.php on line 313

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/tgarchive/forum/include/parser.php on line 414

#6 22-03-2008 14:48:18

Toucouleur
Survivors
Lieu: Perpignan
Date d'inscription: 30-09-2005
Messages: 790
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Siddartha a �crit:

Bah tlm a php5 non now ?
Et en particulier Toucouleur ! ;-)

merci à vous 2, c'est vrai que ta solution est pas mal Sid, mais dans mon contexte, je veux vraiment quelque chose de très personnalisable pour aller chercher ce que bon me semble en spécifiant les balises avant et arrière.

function findinside($start, $end, $string) {
       preg_match_all('/' . preg_quote($start, '/') . '(.*?)' . preg_quote($end, '/').'/si', $string, $m);
        return $m[1];
    }
   
    $start = "<td bgcolor=#DDDDDD colspan=10><big><b>";
    $end = "</b></big></td>";

dans le même exemple qu'indiqué plus haut, là typiquement l'extraction fonctionne pas

ça fonctionne pour

Code:

    $start = "<td bgcolor=#DDDDDD colspan=10>";
    $end = "</td>";

mais pas pour

Code:

$start = "<td bgcolor=#DDDDDD colspan=10><big><b>";
    $end = "</b></big></td>";

j'imagine que mon problème vient que des espaces sont placés entre les différentes balises ?

edit : non ça vient pas des espaces c pas simple ces foutus expressions reg. :r(


"Le luxe est naturellement associé à la richesse qui permet des investissements qui visent le pur agrément et non le profit."

Hors ligne

 

#7 22-03-2008 18:47:46

Toucouleur
Survivors
Lieu: Perpignan
Date d'inscription: 30-09-2005
Messages: 790
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Re

J'ai un peu de mal à le faire fonctionner, car les Xquery que j'obtiens sont mal foutus pour être reexploité comme tel, mais je ne doute pas que des Twenga et cie ont utilisé ce type de technique pour te scrapper ton catalogue en un rien de temps : http://twit88.com/blog/2007/11/19/solve … generator/

pour mon pb, pour la solution à partir de la piste donnée par Sid, ça me donne ceci :

Code:

$dom = new Domdocument();
@$dom->loadHTMLFile($url_to_get_content_from);
$xpath = new DOMXPath($dom);


$big = $xpath->evaluate("//td/big/b");

echo $big->length;

echo "<hr />";

for ($i = 0; $i < $big->length; $i++) {
echo $big->item($i)->textContent . '<br  />';

}

A moi un Twenga bis smile


"Le luxe est naturellement associé à la richesse qui permet des investissements qui visent le pur agrément et non le profit."

Hors ligne

 

#8 22-03-2008 19:02:43

klelugi
Tagglers+
Lieu: paris
Date d'inscription: 20-09-2005
Messages: 731
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Wow impressionant de simplicité en effet wink

Merci pour la méthode Sid ^^

Hors ligne

 

#9 22-03-2008 22:45:57

Siddartha
Administrateur
Lieu: Paris et #66valley ☼
Date d'inscription: 20-06-2005
Messages: 2988
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Ben voila 5 lignes de code et des tera octets de données prêts à être insérer dans vos bdd et website ;-)

Hors ligne

 

#10 23-03-2008 09:04:11

appollo
Rémy BLANCHARD
Lieu: Lyon
Date d'inscription: 04-09-2005
Messages: 1272
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Effectivement j'ai testé le bout de code de site ca marche très bien et ca ma donnée une idée thank's

Hors ligne

 

#11 23-03-2008 09:24:18

easyguy
Tagglers
Date d'inscription: 04-10-2005
Messages: 761

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Ouais et Sid en a déjà parlé y a ... quelques mois ... c'est bien de suivre les gars big_smile

Derni�re modification par easyguy (23-03-2008 09:24:34)


Trouver un Appartement à Paris ou en région Ile de France. En province :  Immobilier Lyon, ou Immobilier Annecy

Hors ligne

 

#12 23-03-2008 10:11:20

Toucouleur
Survivors
Lieu: Perpignan
Date d'inscription: 30-09-2005
Messages: 790
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Kk1 utilise ou exploite Slovent pour les XQuery ? http://twit88.com/blog/2007/11/19/solve … generator/ ?


"Le luxe est naturellement associé à la richesse qui permet des investissements qui visent le pur agrément et non le profit."

Hors ligne

 

#13 24-03-2008 17:39:15

Toucouleur
Survivors
Lieu: Perpignan
Date d'inscription: 30-09-2005
Messages: 790
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Je me répond à moi même : ce con de Firefox (PC ou Mac) corriges toutes structures HTML qui est dans son rendu HTML. du coup quand vous scrappez un vieux site tout pourri avec des tableaux, pensez à virer les trucs qui ne vous servent à rien du genre Tbody.

Laissez tombez Solvent et cie, j'ai enfin compris tout le potentiel de Firebug smile

J'ai dis déjà merci Sid ? smile


"Le luxe est naturellement associé à la richesse qui permet des investissements qui visent le pur agrément et non le profit."

Hors ligne

 

#14 03-10-2017 08:26:21

salemioche
Survivors
Lieu: blue sky
Date d'inscription: 06-07-2005
Messages: 4128
Site web

Re: Extraction texte en fonction de balise HTML avec Preg_match_all

Inusable regexp smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 R. Andersson