Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm

- 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 smile
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 wink

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 wink

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 wink (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 big_smile
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 big_smile
Puis j'ai utilisé le pipe, et les redirections de résultat big_smile

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... roll 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 hmm

bon, une indication : il y a Xpath ou xmlInit pour faire ce que tu veux.


-- Lucid Lynx --

Hors ligne