#1 Le 21/12/2010, à 13:01
- Link_Octree
[AIDE] Récupération et extraction de donnée d'une page HTML via cURL
Bonjour,
cURL m'a l'air d'être un outil très puissant, malheuresement je débute avec celui-ci, et j'ai un peu de mal
- Premièrement, je voudrais télécharger une page web, par exemple celle-ci: http://twitter.com/archlinux
Je pense qu'on peut aussi faire çà avec wget, mais pour le futur, il me faudra passer par cURL alors autant me familiariser avec
Je fais donc dans un terminal:
curl -o archtwitter.html http://twitter.com/archlinux
- A présent, je voudrais extraire le dernier tweet de cette page, j'ai un peu regardé le code source et la partie intéressante contient ce code
<ol id='timeline' class='statuses'>
<li class="hentry u-archlinux status latest-status" id="status_27769461880"
>
<span class="status-body">
<span class="status-content">
<span class="entry-content">Python is now Python 3: Allan McRae wrote:
A major Python update has just been moved from the testing
repositories... <a href="http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S" class="tweet-url web" rel="nofollow" target="_blank">http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S</a></span>
</span>
<span class="meta entry-meta" data='{}'>
<a class="entry-date" rel="bookmark" href="http://twitter.com/archlinux/status/27769461880">
<span class="published timestamp" data="{time:'Mon Oct 18 21:08:39 +0000 2010'}">2:08 PM Oct 18th</span></a>
<span>via <a href="http://twitterfeed.com" rel="nofollow">twitterfeed</a></span>
</span>
<ul class="meta-data clearfix">
</ul>
</span>
</li>
Je pense qu'on peut repérer le dernier tweet dans le code source grâce au
<li class="hentry u-archlinux status latest-status" id="status_27769461880">
Donc maintenant, mettons que je veille extraire par exemple l'url présente dans le dernier tweet publié, comment puis-je faire celà ?
J'ai déja appercu des codes pour extraire de données avec grep, sed, cut ou je ne sais plus quoi, mais c'était incompréhensible pour moi.
Vu que c'est une fonction dont je serai toujours amené à me servir, j'aimerai la comprendre une bonne fois pour toute, plutot que d'avoir à demander à chaque fois comment faire :S
Merci d'avance
Hors ligne
#2 Le 21/12/2010, à 16:23
- sensini
Re : [AIDE] Récupération et extraction de donnée d'une page HTML via cURL
Salut,
alors effectivement, grep sed awk cut, ça parait un peu compliqué (et ça peut l'être) mais c'est très puissant.
Je t'invite à lire des tutoriels dessus (en plus des pages man :þ), tu apprendras plein de choses.
Par exemple pour sed et awk : http://www.grymoire.com/Unix/Sed.html http://www.grymoire.com/Unix/Awk.html
En très gros, les usages basiques que j'ai de ces commandes (j'utilise cat bien que ce ne soit pas nécessaire…) :
cat fichier | grep motif
: affiche les lignes avec l'expression régulière motif à l'intérieur
cat fichier | sed 's/ancien/nouveau/g'
: remplace le mot ancien par nouveau dans tout le fichier (et la sortie se fait sur stdout)
cat fichier | cut -d',' -f3
: découpe le fichier en colonne suivant le délimiteur «:» et affiche la troisième colonne
cat fichier | awk '{a[$1]+=$2;b[$1]++}END{for (index in a){print index,a[index]/b[index]}}'
affiche pour chaque valeur de première colonne, la valeur moyenne de la 2m colonne
Bon, passé cet introduction attaquons nous à ton problème. Il y a plusieurs façon de faire, je t'en présente une seule.
D'abord, récupérer la portion de texte qui t'intéresse. pour cela sed ou awk peuvent faire l'affaire
cat archtwitter.html | sed -n '/latest-status/,/<li/ p'
donne
<li class="hentry u-archlinux status latest-status" id="status_27769461880"
>
<span class="status-body">
<span class="status-content">
<span class="entry-content">Python is now Python 3: Allan McRae wrote:
A major Python update has just been moved from the testing
repositories... <a href="http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S" class="tweet-url web" rel="nofollow" target="_blank">http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S</a></span>
</span>
<span class="meta entry-meta" data='{}'>
<a class="entry-date" rel="bookmark" href="http://twitter.com/archlinux/status/27769461880">
<span class="published timestamp" data="{time:'Mon Oct 18 21:08:39 +0000 2010'}">2:08 PM Oct 18th</span></a>
<span>via <a href="http://twitterfeed.com" rel="nofollow">twitterfeed</a></span>
</span>
<ul class="meta-data clearfix">
</ul>
</span>
</li>
par défaut, sed affiche chaque ligne, l'option -n lui dit que non. le p de la fin quant à lui permet d'afficher les lignes correspondantes à la commande précédente
/latest-status/,/<li/ dit d'afficher (p) les lignes entre le motif latest-status et <li
sed -n '/latest-status/,/<li/ p' : affiche les lignes entre latest-status et <li, supprime le reste
Ensuite, tu veux récupérer l'url à l'intérieur du tweet
pour ça tu vois que les balises de lien des tweets ont une classe: class="tweet-url web"
donc tu utilises grep "tweet-url web" sur ton résultat:
cat archtwitter.html | sed -n '/latest-status/,/<li/ p' | grep 'tweet-url web'
donne
repositories... <a href="http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S" class="tweet-url web" rel="nofollow" target="_blank">http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S</a></span>
Pour récupérer l'url, là encore plusieurs façons. Je te propose d'utiliser awk:
awk '{for(i=1;i<=NF;i++){print $i}}' : pour chaque mot de la ligne (NF = Nb Fields =Nb de champs) affiche le ième mot ($i, $0 correspond à toute la ligne, $1 au premier mot etc)
cat archtwitter.html | sed -n '/latest-status/,/<li/ p' | grep 'tweet-url web' | awk '{for(i=1;i<=NF;i++){print $i}}'
repositories...
<a
href="http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S"
class="tweet-url
web"
rel="nofollow"
target="_blank">http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S</a></span>
ensuite tu veux récupérer la ligne avec href, donc, grep href
cat archtwitter.html | sed -n '/latest-status/,/<li/ p' | grep 'tweet-url web' | awk '{for(i=1;i<=NF;i++){print $i}}' | grep "href"
href="http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S"
comme tu veux seulement le lien, tu vas découper la ligne suivant les «"» et prendre la 2m colonne:
cat archtwitter.html | sed -n '/latest-status/,/<li/ p' | grep 'tweet-url web' | awk '{for(i=1;i<=NF;i++){print $i}}' | grep "href" | cut -d'"' -f2
http://[color=red][b][Merci de relire les règles][/b][/color]/bNhu4S
Encore une fois, tu peux arriver au même résultat avec une tout autre ligne de commande:
awk '/<li/{deb=0} /latest-status/{deb=1;print} {if(deb){print}}' archtwitter.html | sed -n '/tweet-url web/ s/.*href="\([^"]*\)".*/\1/g p'
fait quasiment la même chose
Du coup, pas de mystère, pour maitriser ces fonctions (ou du moins les bases de ces fonctions) il faut les tester, et pour ça rien de mieux que de reproduire les tutoriels (cherche aussi avec les mots clefs «premiers pas» ou «initiation»)
http://abs.traduc.org/abs-5.0-fr/apc.html les commandes basiques de sed et awk
http://docstore.mik.ua/orelly/unix/sedawk/index.htm plus complet mais en anglais
http://doc.ubuntu-fr.org/aptitude
http://bepo.fr
Pensez à chercher sur un moteur de recherche avant de demander http://google.fr/ ;)
Hors ligne
#3 Le 22/12/2010, à 15:16
- Link_Octree
Re : [AIDE] Récupération et extraction de donnée d'une page HTML via cURL
Alors çà, c'est un post complet
Merci énormément pour avoir détaillé tout celà, j'ai fait quelques test sur d'autres scripts, grep c'est OK, cut et sed c'est déja bien moins flou qu'avant
Puis j'ai utilisé le pipe, et les redirections de résultat
Hors ligne
#4 Le 23/12/2010, à 21:13
- Kanor
Re : [AIDE] Récupération et extraction de donnée d'une page HTML via cURL
Pauvre développeur il se font chier à coder des truc super pratique et on les utilise pas
pour twitter tu a une api super complète voir par exemple
http://dev.twitter.com/doc/get/statuses/user_timeline
Hors ligne
#5 Le 23/12/2010, à 22:05
- Totor
Re : [AIDE] Récupération et extraction de donnée d'une page HTML via cURL
@Kanor : sauf que ça ne l'avance pas plus... le flux retourné est au format json, xml, rss ou atom
donc de toute façon, il va lui falloir extraire l'info du flux en sortie. ce qui ne change rien au pb
bon, une indication : il y a Xpath ou xmlInit pour faire ce que tu veux.
-- Lucid Lynx --
Hors ligne