# Récupérer des données sur un site

**URL:** <https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 1:43 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660 "2016-02-21T13:43:43Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 1:43 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/1 "2016-02-21T13:43:43Z")

</div>

Salut,  
J’ai besoin de récupérer des informations (les taux de change du jour) sur ce site:

[banque-centrale.mg/index.php?id=m5\_1\_1](http://www.banque-centrale.mg/index.php?id=m5_1_1)

J’ai essayé plein de trucs avec lynx wget curl, mais je n’arrive à rien de propre.  
Si une bonne âme pouvait jeter un oeil la dessus ce serait bien sympa.

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 1:43 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/2 "2016-02-21T13:43:43Z")

</div>

Re,  
Je vais quand même vous dire ou j’en suis…

```auto

```

J’ai plein de trucs parasites avec cette commande, je ne sais pas comment nettoyer…

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:43 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/3 "2016-02-21T13:43:46Z")

</div>

J’avais pommé ta question, tu as bien fais de faire remonter. Je te propose un truc en python avec BeautifulSoup :

[code]#!/usr/bin/python

from BeautifulSoup import BeautifulSoup  
import urllib

#url = '[http://www.banque-centrale.mg/index.php?id=m5\_1\_1](http://www.banque-centrale.mg/index.php?id=m5_1_1)’  
url = 'index.html’  
html\_file = urllib.urlopen(url)

soup = BeautifulSoup(html\_file)

for money in soup.findAll(‘table’)[10].findAll(‘tr’):  
tds=money.findAll(‘td’)  
print tds[0].string, ‘=\>’, tds[1].string[/code]  
Faut changer la variable url pour télécharger la page (j’ai eu des problèmes de très grosses lenteur au bout d’un moment pour télécharger leur page. J’y connais rien dis-moi si c’est d’autres parties de la pages dont tu as besoin (je pense au tableau du haut).

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 1:43 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/4 "2016-02-21T13:43:47Z")

</div>

Salut,  
Rien à dire, c’est beau et efficace!  
J’ai essayé d’insérer un envoie du résultat par mail, mais python et moi ça fait trois…

J’ai donc simplement ajouté une tâche cron, et j’ai les taux directe ds ma boite mail.

Une dernière chose, puisque tu es bien disposé… 😉  
Tu pourrais aussi me sortir la date (c’est «&nbsp;imprimé&nbsp;» sur le site): Cours des devises en date du 23/11/12

Merci beaucoup! ![:038](https://www.debian-fr.org/uploads/default/original/1X/08df484251490af77ba342c0331f3ee271065fe9.gif "bravo")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:43 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/5 "2016-02-21T13:43:48Z")

</div>

Comme ça ? 🙂

[code]#!/usr/bin/python

from BeautifulSoup import BeautifulSoup  
import urllib

#url = '[http://www.banque-centrale.mg/index.php?id=m5\_1\_1](http://www.banque-centrale.mg/index.php?id=m5_1_1)’  
url = 'index.html’  
html\_file = urllib.urlopen(url)

soup = BeautifulSoup(html\_file)

tables = soup.findAll(‘table’)

print tables[4].findAll(‘p’)[1].string

for money in tables[10].findAll(‘tr’):  
tds=money.findAll(‘td’)  
print tds[0].string, ‘=\>’, tds[1].string[/code]

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 1:43 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/6 "2016-02-21T13:43:55Z")

</div>

C’est parfait, merci.  
Tu vas nous rendre fainéants à nous mâcher le travail comme ça…

Par contre, j’avoue ne pas bien comprendre comment tu trouve les numéros de tables dans lesquelles tu va chercher les infos.  
J’ai bien cherché en éditant le code de la page, mais je n’ai pas trouvé.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:43 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/7 "2016-02-21T13:43:56Z")

</div>

Une petite explication de texte ? 😛

[code]html\_file = urllib.urlopen(url) # je télécharge la page

soup = BeautifulSoup(html\_file) # je donne la page à manger à beautifulSoup

tables = soup.findAll(‘table’) # je recherche toutes les balises

 (récurssivement)

print tables[4].findAll(‘p’)[1].string # dans la 5ème (on compte à partir de 0) je cherche toutes les balises

et je prends ce qui est dans la seconde

for money in tables[10].findAll(‘tr’): # dans la 11ème

 je cherche tout les tr (les lignes du tableau)  
tds=money.findAll(‘td’) # je cherche chaque colone  
print tds[0].string, ‘=\>’, tds[1].string # j’affiche la première et la dernière[/code]

C’est probablement sous optimal, mais c’est rapide à coder. Pour trouver j’y suis allé en mode exploration et j’ai regardé où ce qu’il y avait dans chaque table, puis chaque

, etc (en ayant en tête que ce que je voulais était dans tel ou tel balise qui se trouvait dans une table…). Rien de bien sorcier.

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 21, 2016, 1:46 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/8 "2016-02-21T13:46:47Z")

</div>

À titre indicatif, ce que j’ai pondu pour les pages

[boisson.homeip.net/RER.html](http://boisson.homeip.net/RER.html)  
et  
[boisson.homeip.net/cgi-bin/MA.cgi](http://boisson.homeip.net/cgi-bin/MA.cgi)

BeautifulSoup permet d’économiser 🙂

[getRER.sh](http://getRER.sh) (toutes les 5 mns)

`#!/bin/sh
LANG=fr
LC_ALL=fr_FR
PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/usr/local/mupad/share/bin
cd /tmp
wget -q --timeout=60 http://www.transilien.com/ -O /tmp/tRER
export LIGNEOK=$(cat /tmp/tRER | grep -E "rer|afic" | grep "<img src=" | grep -A 1 "rer..png" | grep -B 1 trafic_ok | grep RER | sed -e '1,$s/^.*RER \(.\).*$/\1/' )
cd ~
echo -n $(date)": RER " >> RER
echo $LIGNEOK >> RER
./tauxRER.sh "$LIGNEOK"`

[tauxRER.sh](http://tauxRER.sh)

[code]#!/bin/bash  
declare -a TAUX  
declare -a JOURNEE  
declare -a SEMAINE  
declare -a MOIS  
declare -a MAUVAIS  
TOTAL=$(grep -c “” RER)  
#echo $TOTAL  
j=0  
for i in A B C D E ; do  
j=$(($j+1))  
TAUX[$j]=$(expr 1000 \* $(grep -v -c -E “RER ._$i" RER) / $TOTAL | sed -e ‘s/(.)$/.\1/’ | sed -e ‘s/^./0./’)  
if $(tail -n 1 RER | grep -q -c -E "RER ._$i”) ; then  
MAUVAIS[$j]=0  
else  
MAUVAIS[$j]=1  
fi  
TEMP=$(tail -n 288 RER | grep -v -c -E “RER ._$i")  
JOURNEE[$j]=`expr 1000 \* $TEMP / 288 | sed -e 's/\(.\)$/.\1/' | sed -e 's/^\./0./'`  
TEMP=$(tail -n 2016 RER | grep -v -c -E "RER ._$i”)  
SEMAINE[$j]=`expr 1000 \* $TEMP / 2016 | sed -e 's/\(.\)$/.\1/' | sed -e 's/^\./0./'`  
TEMP=$(tail -n 8064 RER | grep -v -c -E “RER .\*$i”)  
MOIS[$j]=`expr 1000 \* $TEMP / 8064 | sed -e 's/\(.\)$/.\1/' | sed -e 's/^\./0./'`  
#echo $"TAUX$i"  
done  
DIR=`pwd`  
cd /tmp  
cat \> /var/www/RER.html \<\<EOF

État du RER à Paris

  
  
EOF j=0 for i in A B C D E ; do j=$(($j+1)) echo "" \>\> /var/www/RER.html echo "" \>\> /var/www/RER.html echo "" \>\> /var/www/RER.html echo "" \>\> /var/www/RER.html echo "" \>\> /var/www/RER.html echo "" \>\> /var/www/RER.html done cat \>\> /var/www/RER.html \<\<EOF

| **Ligne concernée** | **État actuel** | **% problèmes sur 24h** | **% sur 7 jours** | **% sur un mois** | **depuis le 22/11/2012** |
| RER $i | ![]() | ${JOURNEE[$j]} % | ${SEMAINE[$j]} % | ${MOIS[$j]} % | ${TAUX[$j]} % |

[Détails des problèmes](http://www.transilien.com/web/site/accueil/etat-trafic/trafic-jour), notez que TRANSILIEN ne signale PAS tous les problèmes surtout sur le RER D.

EOF cd $DIR NO= for i in A B C D E ; do PANNE=$(grep "Etat du trafic RER \*$i" /tmp/tRER | sed -e 's|^.\*tat du trafic RER.\*"\>\(.\*\).\*$|\1|' | recode -d u8..h4) if [! -z "$PANNE"] ; then echo $PANNE"  
" \>\> /var/www/RER.html if [-z $NO] ; then date \>\> PannesRER NO=Yes fi echo $PANNE\>\> PannesRER fi done cat \>\> /var/www/RER.html \<\<EOF

EOF [/code]

[code]#!/bin/sh  
echo Content-type: text/html  
echo ""  
PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/usr/local/mupad/share/bin  
if [-z $1] ; then  
NUM=7  
else  
NUM=$1  
fi  
cat \<\<EOF

EOF USER=francois wget -q "http://www.transilien.com/gare/pagegare/filterListeTrains?codeTR3A=MFA&destination=PARIS+GARE+DE+LYON&ligne=&nomGare=MAISONS+ALFORT+ALFORTVILLE&x=38&y=10" -O - | html2text -nobs -ascii| grep "D]" | grep -v "\[D\]" | (while read LIGNE ; do if (echo $LIGNE | grep -q -v "Voir") ; then DEST=$DEST" "$(echo $LIGNE | sed -e 's/^.\*D] \*//' | sed -e 's/^.\*\[RER \*//') else TRAIN=$(echo $LIGNE | sed -e '1,$s/.\*D\] \*//' | sed -e'1,$s/\[RER \*//' | sed -e '1,$s|^ \*\([A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]\) \*\([^]\*\) \*\(.\*\) \*Voir.\*\(..\)$|\1|') HORAIRE=$(echo $LIGNE | sed -e '1,$s/.\*D\] \*//' | sed -e'1,$s/\[RER \*//' | sed -e '1,$s|^ \*\([A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]\) \*\([^]\*\) \*\(.\*\) \*Voir.\*\(..\)$|\2|') DEST=$DEST" "$(echo $LIGNE | sed -e '1,$s/.\*D\] \*//' | sed -e'1,$s/\[RER \*//' | sed -e '1,$s|^ \*\([A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]\) \*\([^]\*\) \*\(.\*\) \*Voir.\*\(..\)$|\3|') VOIE=$(echo $LIGNE | sed -e '1,$s/.\*D\] \*//' | sed -e'1,$s/\[RER \*//' | sed -e '1,$s|^ \*\([A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]\) \*\([^]\*\) \*\(.\*\) \*Voir.\*\(..\)$|\4|') fi if (echo $LIGNE | grep -q "^D]") ; then echo "" DEST="" fi done) | recode -d u8..h4 # | grep ".\*RER D.\*RER [A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9] " | sed -e '1,$s|^.\*RER \([A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]\) \*\([^]\*\) \*\(.\*\) \*Voir.\*\(..\)$|\2|' | recode -d u8..h4 cat \<\<EOF

| $TRAIN | $HORAIRE | ${DEST} | Voie $VOIE |
| \1 | \3 | \4 |

EOF [/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:46 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/9 "2016-02-21T13:46:48Z")

</div>

Mon dieux, ne me parle pas du RER, pas aujourd’hui. Entre les deux jours de MiniDebConf j’ai voulu aller à Versaille voir mon neveu, manque de bol ce week end pas RER pour Porchefontaine et personne à la RATP capable de me dire comment me débrouiller… Au final 2h aller 2h retour. Les transports en commun franciliens c’est un monde de fou.

Enfin bref pour mieux comparer voici une version python/BeautifulSoup de ton dernier script :

```auto
#!/usr/bin/python

from BeautifulSoup import BeautifulSoup
import urllib

print 'Content-type: text/html'
print

url='http://www.transilien.com/gare/pagegare/filterListeTrains?codeTR3A=MFA&destination=PARIS+GARE+DE+LYON&ligne=&nomGare=MAISONS+ALFORT+ALFORTVILLE&x=38&y=10'

html_file = urllib.urlopen(url)

soup = BeautifulSoup(html_file)

print """<html>
<body>
<table>"""

main_table = soup.findAll('table', 'etat_trafic')[0]

for ligne in main_table.findAll('tr')[1:-1]:
    tds=[td.string.strip() for td in ligne.findAll('td') if td.string != None]
    print '<tr><td>',tds[0],'</td><td>',tds[1],'</td><td>',tds[2],'</td><td>',tds[3],'</td></tr>'

print """</table>
</body>
</html>"""
```

J’ai beau aimer les expressions régulières je préfère la version python 🙂

---

<div class="post-metadata">

**Author:** ![bech](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/b5ac83/32.png) [@bech](https://www.debian-fr.org/u/bech)\
**Post date:** [Février 21, 2016, 1:46 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/10 "2016-02-21T13:46:48Z")

</div>

Ce traitement peut aussi se faire avec un shell.

Déjà après avoir téléchargé la page :

```auto

```

permet une sortie plus lisible (en supposant que la page soit dans index.php?id=m5\_1\_1 )

Ensuite, il ne manque plus qu’a enlever des caractères parasites :

```auto

```

ou encore avec awk :

```auto

```

(en mettant 3 blancs dans la 2ème chaine du tr, ce qui ne passe pas sur la page du forum)

ou plus bestialement avec cut :

```auto

```

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 21, 2016, 1:46 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/11 "2016-02-21T13:46:49Z")

</div>

Là je suis sur le quai bondé, 10 minutes de retard…  
Ton script est mieux, je vais voir ça.

Remarque: d’ après le site pas de retard ce main pour 10 minutes sur tous les trains…

---

<div class="post-metadata">

**Author:** ![M3t4linux](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/5daacb/32.png) [@M3t4linux](https://www.debian-fr.org/u/M3t4linux)\
**Post date:** [Février 21, 2016, 1:46 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/12 "2016-02-21T13:46:51Z")

</div>

@misterfreez : tu es assez orienté python pour le coup, Perl ne te donne pas de la bonne soupe??

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:46 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/13 "2016-02-21T13:46:56Z")

</div>

BeautifullSoup est une référence dans le domaine, j’ai juste profité de l’occasion pour l’essayer (et elle vaut sa réputation). Je m’éttais dis que je regarderais ce qu’il y a en perl, mais je ne l’ai pas fait avant que tu en parle. Sur cpan j’ai pas vu de module qui sort vraiment du lot, j’ai l’impression qu’il n’y a pas eu l’émergence d’un véritable équivalent (mais il faudrait que je regarde de plus près).

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/14 "2016-02-21T13:48:46Z")

</div>

[quote=“MisterFreez”]Une petite explication de texte ? 😛  
…  
C’est probablement sous optimal, mais c’est rapide à coder. Pour trouver j’y suis allé en mode exploration et j’ai regardé où ce qu’il y avait dans chaque table, puis chaque

, etc (en ayant en tête que ce que je voulais était dans tel ou tel balise qui se trouvait dans une table…). Rien de bien sorcier.[/quote]

Merci pour l’explication, j’avais déjà un peu cherché du coup.  
J’ai quand même encore une question, pour trouver le n° de table, tu compte chaque

 ?

Je pourrais faire un srcipt avec juste ça pour trouver toutes les tables (sans avoir à ouvrir le html et compter…) ?`tables = soup.findAll('table')`

Je vais essayer…

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/15 "2016-02-21T13:48:47Z")

</div>

J’ai devant moi une machine qui fait des millions d’opérations arithmétiques par seconde, je vais pas m’embêter à compter sur mes doigts.

`i = 0
for table in soup.findAll('table'):
    print '=====', i
    i += 1
    print table`

De plus c’est une recherche récursive donc (id sont les indices) :

```auto
<table id="0">
   <table id="1">
      <table id="2">
      </table>
   <table>
</table>
<table id="3">
</table>
```

---

<div class="post-metadata">

**Author:** ![fluo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/e9bcb4/32.png) [@fluo](https://www.debian-fr.org/u/fluo)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/16 "2016-02-21T13:48:52Z")

</div>

Très interressant, car moi aussi, il y avait une période où je faisais de l’extraction de données d’un site tiers sur du long terme.

Mais la crainte est le changement du code source du site tiers.

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/recuperer-des-donnees-sur-un-site/55660/17 "2016-02-21T13:48:53Z")

</div>

Merci,  
J’en étais à mettre mes doigts sur l’écran pour compter…  
Manque plus que le tipex… ![:text-blondmoment:](https://www.debian-fr.org/uploads/default/original/1X/8318fa28e2754e947717e424275f193e7ede6962.gif "Blonde Moment")
