Forum dédié au moteur de recherche et aux techniques d'optimisation par #taggle
Vous n'�tes pas identifi�.
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 :
$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 :
<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
$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!
Hors ligne
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) :
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
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
$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 :
$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
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
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
$start = "<td bgcolor=#DDDDDD colspan=10>"; $end = "</td>";
mais pas pour
$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(
Hors ligne
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 :
$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
Hors ligne
Wow impressionant de simplicité en effet
Merci pour la méthode Sid ^^
Hors ligne
Ouais et Sid en a déjà parlé y a ... quelques mois ... c'est bien de suivre les gars
Derni�re modification par easyguy (23-03-2008 09:24:34)
Hors ligne
Kk1 utilise ou exploite Slovent pour les XQuery ? http://twit88.com/blog/2007/11/19/solve … generator/ ?
Hors ligne
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
J'ai dis déjà merci Sid ?
Hors ligne
Inusable regexp
Hors ligne