Page 1 sur 1

Parser une page

Posté : 04 sept. 2006, 13:45
par stever
Bonjour je viens de découvrir qu'il est possible de parse des pages internet

j'avoue que je suis perdu personne n'aurais un petit coup de pouce a me donner pour récupérer par exemple sur la page les info suivantes :

Nom de la commune : Lisle-en-Rigault

Superficie : 1054 hectares

Altitude : 187 mètres

et les enregistrer dans un fichier
idem pour toutes les communes

sachant que je peux avoir la liste des communes (qui est la variable de la requete).

Le theme parser n'est peut etre pas bon, on tous cas ce que je veux faire c'est enregistrée des info d'un site pour construire une base de donnée.

Posté : 04 sept. 2006, 15:18
par jojolapine
il y a plusieurs méthodes pour faire cela, mais elles ne sont pas fiable...
Disons que par exemple tu cherches le nom de la commune, dans le fichier source, tu as ceci:

Code : Tout sélectionner

<div class="titreur"> <h2><a href='france.html'>La France</a></h2> <h3><a href='communes.html'>Villes et villages</a></h3> <h4>Lisle-en-Rigault</h4> </div>
Donc quand tu vas parser ta page, tu cherchera "ce qu'il ya dan le div titreur entre les balises h4", seulement au moindre changement de design du site, paf tout est à refaire....
Donc bon je sais pas trop si cette solution te convient?

Posté : 04 sept. 2006, 16:31
par stever
Les info intéressantes a récupérer sont :

Code : Tout sélectionner

<table class="donneesprincipales"> <tr> <td><h4>Nom de la commune</h4><strong>Lisle-en-Rigault</strong></td> <td><h4>Région</h4><a href="./regions.html?mode=detail&reg=57" title="fiche de la région">Lorraine</a></td> <td><h4>Département</h4><a href="./departements.html?mode=detail&dep=55&style=fiche" title="fiche du département">Meuse</a> (55)</td> <td><h4>Code postal</h4><a href="./communes.html?mode=query&req=55000&style=fiche&zoom=1" title="toutes les communes ayant ce code postal">55000</a></td> </tr> </table>

Posté : 04 sept. 2006, 17:02
par Ryle
A première vue, ton expression régulière n'est pas bonne : "[alpha]-[alpha]" pour "Lisle-en-Rigault", soit il te manque un tiret, soit elle est a revoir si tu veux récupérer des noms qui n'en auraient pas ou plus... :)

Posté : 04 sept. 2006, 18:42
par Invité
même en modifiant [alpha]-[alpha] par [alpha]-[alpha]-[alpha] pour l'exemple cela ne marche pas.

Pour l'histoire des - avec ou sans je verrais plus tard quand le reste marchera

Posté : 04 sept. 2006, 18:53
par stever
Pour être plus clair je détaille ce qui ne marche pas

Sur la page externe a mon site (serveur)

je tente de trouver dans le code source (html) de la page la ligne qui contient le mot clef "Nom de la commune"

Code : Tout sélectionner

$line=fgets($file,1024); while(!strstr($line,"Nom de la commune"))


en suite je tente de recupérer dans cette ligne les caractères contenus entre les balises <strong>

Code : Tout sélectionner

ereg("<br>(<strong>[alpha]-[alpha]</strong>)</b>",$line,$no);

pour enfin afficher le nom de la commune grace a la variable $parser (sur mon site)

Code : Tout sélectionner

echo $parser->get_nom_commune();

Posté : 04 sept. 2006, 19:09
par Henri
Humble avis : s'amuser à faire des expressions régulières sur l'ensemble d'une page HTML aussi touffue qu'une page du Quid n'est peut être pas très efficace. Ayant eu à traiter un problème similaire, j'ai commencé par virer 90% du code HTML inutile pour me concentrer sur la partie du code comportant les infos qui m'intéressaient. Par exemple, tu cherches la position de

Code : Tout sélectionner

<table class="donneesprincipales">
et tu fais un substring à partir de cette position.

Idem pour la fin de page, tu vires tout ce qu'il y a après "Généralités historiques" si tu n'en as pas besoin ou "trouver un hôtel").

A partir de là, le code HTML qu'il te reste à étudier n'est pas trop lourd.

Posté : 04 sept. 2006, 19:13
par Ryle
Sans aller regarder plus loin pour l'instant, l'autre problème flagrant de ton expression est l'absence de quantificateur :
[alpha]-[alpha] correspond à "une lettre, un tiret, une lettre"

Tu devrais jeter un oeil sur le tuto des expressions régulières du site :)

Posté : 04 sept. 2006, 21:36
par stever
ok merci les gas de votre aide

est il possible de reprendre le script pas a pas.

Commencon par la proposition d'Henri

concernant le nettoyage comment faire pour effectuer ce nettoyage avec un substring

PS : si Henri a deja fait cela tu as surement un script complet pouvant servir d'exemple sous la main :lol:


Concernant les expression régulière je pense que

Code : Tout sélectionner

ereg("<br><strong>([^<]+)</strong></b>",$line,$no);
doit pouvoir faire l'affaire

Posté : 04 sept. 2006, 21:50
par Cyrano
stever, loin de moi l'idée de réfreiner ton enthousiasme, mais as-tu un tout petit peu parcouru la doc PHP ? Exemple, si tu regarde la doc pour la fonction substr(), tu vas voir des exemples concrets, basiques certes, mais c'est le propre de toute documentation. Reste à intégrer ça dans un code cohérent et logique.

Posté : 05 sept. 2006, 08:19
par stever
substr()

permet d'extraire une chaine de caractère mais faut indiquer le lombre de caractère que l'on souhaite extraire

mais comme la page change en fonction des communes je en connais pas le nombre de caractère a extraire.

Code : Tout sélectionner

echo substr('abcdef', 1); // bcdef echo substr('abcdef', 1, 3); // bcd echo substr('abcdef', 0, 4); // abcd echo substr('abcdef', 0, 8); // abcdef echo substr('abcdef', -1, 1); // f

Posté : 05 sept. 2006, 08:34
par Cyrano
Donc cette fonction n'est peut-être pas appropriée. Pourquoi ne pas se tourner dans ce cas vers les expressions régulières et des fonctions telles que preg_match() par exemple ? Cette méthode sera peut-être plus complexe à mettre en oeuvre, mais très efficace. Il y a un tuto sur le site de PHPFrance sur le sujet, un peu ardu j'en conviens, mais il faut plonger dedans pour petit à petit arriver à l'assimiler. Et puis quand tu butes sur un point technique, tu peux toujours venir demander un coup de pouce.

Ce à quoi je veux en venir, c'est qu'on va pouvoir t'aider essentiellement à résoudre des difficultés et corriger des erreurs, beaucoup moins à te dire comment programmer. Il t'appartient de mettre en place la méthodologie de traitement des données que tu veux manipuler.

Posté : 05 sept. 2006, 09:05
par JazzFinder
Je ne veux pas nuire à tes efforts d'apprentissage, mais voici une alternative à ce que tu souhaites faire:

1- un fichier csv établi par l'INSEE qui liste les quelque 39,000 communes de France, incluant les DOM-TOM, avec quelques données de base: code postal, département, code INSEE:
http://www.galichon.com/codesgeo/data/insee.zip

2- parser des données de Wikipedia, encore plus détaillées que le site de quid.fr. Encore mieux, tu peux formuler une demande à cet égard à Wikipedia.
Un exemple de Wikipedia pour ce qui est des communes de France:
- Liste des communes de France
- Communes de la Meuse
- Lisle-en-Rigault

3- Les données que tu cherches à parser sont du domaine public. Donc, elles doivent exister quelque part.

===================
Edit:
Après quelques minutes sur Google, voici ce que tu cherches (tu peux affiner tes recherches bien sûr):
http://perso.orange.fr/sylvain.chardon/ ... listes.htm

Posté : 05 sept. 2006, 09:07
par Henri
mais comme la page change en fonction des communes je en connais pas le nombre de caractère a extraire.
Bien sûr que la position change. c'est bien pour cela que je dis qu'il faut trouver la position de la chaîne avant. C'est d'ailleurs un des buts de la programmation informatique : trouver et traiter des informations qui ne sont jamais les mêmes ni jamais au même endroit. Sinon, cela s'appelle de l'automatisme.

par exemple :
// $texte contient le code html de ta page
$marque_debut = '<table class="donneesprincipales">';
$position_debut = strpos ($texte, $marque_debut);
if ($position_debut > 0) {
  $texte = substr($texte, $position_debut);
}
Je te laisse regarder comment éliminer le texte après une chaîne de caractères données. Mais effectivement, il serait bon que tu ailles faire un petit tour sur la doc PHP et sur un certain nombre de tutoriels.

Posté : 05 sept. 2006, 14:36
par stever
comment faire pour enregistrer ces info dans un fichier ou une base de donnée

1°) faut il mieux enregistrer directement depuis le script dans une base de donnée ou faut il mieux au contraire enregistrer dans un fichier (cache ou plat) puis faire un upload.


2°) commenta faire pour les enregistrer dans la base de donnée

$sql="INSERT INTO commune (nom, superficie, altitude) VALUES (..........)";

que faut il mettre a la place des ............ car '$nom','$dep' ça marche pas.



3°) et dans un fichier plat

car

Code : Tout sélectionner

$txt_fichier =$nom.$dep; $f=fopen($fichier,'w'); fwrite($f,$txt_fichier); fclose($f);