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

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

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.

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

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

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
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).

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é… :wink:
Tu pourrais aussi me sortir la date (c’est “imprimé” sur le site): Cours des devises en date du 23/11/12

Merci beaucoup! :038

Comme ça ? :slightly_smiling:

[code]#!/usr/bin/python

from BeautifulSoup import BeautifulSoup
import urllib

#url = '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]

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é.

Une petite explication de texte ? :stuck_out_tongue:

[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.

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

boisson.homeip.net/RER.html
et
boisson.homeip.net/cgi-bin/MA.cgi

BeautifulSoup permet d’économiser :slightly_smiling:

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

[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, 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]

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 :

#!/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 :slightly_smiling:

Ce traitement peut aussi se faire avec un shell.

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

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 :

ou encore avec awk :

(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 :

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…

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

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).

[quote=“MisterFreez”]Une petite explication de texte ? :stuck_out_tongue:

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…

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) :

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

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.

Merci,
J’en étais à mettre mes doigts sur l’écran pour compter…
Manque plus que le tipex… :text-blondmoment: