Accueil du site > SPIP > Exemples de boucles YQL

Exemples de boucles YQL

jeudi 23 décembre 2010, par Fil

YQL (Yahoo Query Language) est à la fois un langage de requête apparenté à SQL et un web-service offrant en standard de nombreuses possibilités. Avec la boucle (DATA), on peut exploiter ces services de façon très simple.

Le format yql de SPIP facilite l’interrogation du service, en passant comme source de données la requête YQL : {source yql, SELECT * FROM service WHERE condition}

On peut aller y chercher par exemple :

Des vidéos YouTube concernant SPIP

Boucle :

<BOUCLE_youtube(DATA)
 {source yql, "select * from youtube.search(50) where query='spip'"}
 {datapath /query/results/video}
 {pagination 5}
>
<dt>
<a href="#URL"><img src="#VALEUR{thumbnails/thumbnail/0/content}" /></a></dt>
<dd><a href="#VALEUR{url}">#VALEUR{title}</a></dd>
</BOUCLE_youtube>
#PAGINATION
<p>#TOTAL_BOUCLE / #GRAND_TOTAL</p>
</B_youtube>

Résultat :

Créer son premier Article Sous SPIP
Installation de SPIP 2
spip installe
...

Adressage. Il faut noter qu’on a ici deux adressages « complexes » du tableau de résultats :
—  {datapath /query/results/video} indique à la boucle qu’elle doit itérer sur le tableau de vidéos, qui se trouve dans un sous-sous-sous-tableau du résultat brut fourni par YQL.
—  #VALEUR{thumbnails/thumbnail/0/content} va chercher la première des images de prévisualisation fournies dans les résultats.

Pour voir comment on détermine cet adressage, vous pouvez analyser dans la console YQL la structure du tableau des résultats : http://developer.yahoo.com/yql/cons... (cliquer sur TREE).

Balises #URL et #VALEUR{url}. Autre remarque, les balises #URL et #VALEUR{url} sont strictement équivalentes dans les boucles (DATA). En revanche, pour des adressages de données complexes (avec un chemin contenant un /), il n’y a pas de balise pour obtenir directement le contenu, et il faut passer par #VALEUR{xxx/yyy}.

Une carte du Mont Saint-Michel

YQL permet de faire une recherche sur YahooMaps.

Boucle :

#SET{place,#ENV{place,Mont Saint-Michel}}
<form action="#SELF" method="POST">
[(#SELF|form_hidden)]
<input type="text" name="place" value="#GET{place}" />
<input type="submit" name="go" value="go" />
</form>
<BOUCLE_map(DATA)
{source yql, select * from maps.map where city=(#GET{place}|_q)}
>
        <img src="#VALEUR{results/Result/content}" />
</BOUCLE_map>

Résultat :

Mélange de boucles : {liste ...}, google.translate et flickr.photos.search

Attention, accrochez-vous : voici un mélange de trois boucles de nature différente : une {liste ..}, et deux YQL, l’une faisant appel aux données du site Flickr, l’autre à Google translate.

Boucle :

<BOUCLE_topic(DATA){liste red, green, blue}>

 <BOUCLE_trad(DATA)
 {source yql, select * from google.translate where q="#VALEUR" and target="fr"}>
 <h3>[(#_topic:VALEUR) =] #VALEUR{results/translatedText}</h3>
 </BOUCLE_trad>


 #SET{query,select * from flickr.photos.search(5) where text="#VALEUR" AND extras='url_sq'}
 <!-- #GET{query} -->

 <BOUCLE_r10(DATA)
 {source yql, #GET{query}}
 {datapath query/results/photo}
 >
   <img src="#URL_SQ" height=#HEIGHT_SQ width=#WIDTH_SQ[
      title="(#TITLE|attribut_html)"]
    />
 </BOUCLE_r10>

</BOUCLE_topic>

La boucle _topic liste trois mots en anglais, qu’on va traduire en français grâce à l’interface YQL pour google.translate, et pour lesquels on va rechercher des photos dans Flickr.

Résultat :

red = rouge

green = vert

blue = bleu

Rien n’interdit bien entendu de mixer des boucles SPIP classiques (SQL) avec des boucles (DATA) et des boucles YQL, pour enrichir votre site. Par exemple, en affichant une carte dans la page de chaque mot-clé géographique.

Autres exemples YQL

Je vous laisse deviner ce que font :
- {source yql, select * from geo.places where text="Mazangé"}
- {source yql, select * from google.search(5) where q='spip'}
- {source yql, select * from delicious.feeds.popular where tag='spip'}
- {source yql, select * from twitter.search where q='earthquake'}
- {source yql, select * from github.user.repos where id='fil'}

Remarque : en YQL, le nombre d’enregistrements souhaité est le plus souvent indiqué entre parenthèses après le nom du service, et non sous la forme SQL LIMIT n.

 

Christian Heilmann vient de signer un bon article d’introduction (en anglais) à YQL : http://www.smashingmagazine.com/2010/12/21/yql-using-web-content-for-non-programmers/

21 Messages de forum

  • Exemples de boucles YQL Le 23 décembre 2010 à 18:16 , par Yohann

    Impressionant… c’est tout ce que je trouve à dire. J’ignorais complétement que Yahoo fournissait un truc aussi puissant…

  • Exemples de boucles YQL Le 24 décembre 2010 à 09:57 , par Cédric

    Superbe boulot !

  • Exemples de boucles YQL Le 28 décembre 2010 à 01:28 , par renato

    c’est simplement genial ! bravo !!

  • Exemples de boucles YQL Le 1er janvier 2011 à 01:10 , par cedric

    Ah, ah çà c’est beau ! :-)

    Cédric

  • Exemples de boucles YQL Le 2 janvier 2011 à 10:02 , par Michel

    vraiment magique.... merci

  • Ah, ça , ça ouvre des perspectives... Le 16 janvier 2011 à 11:17 , par charlux

    Merci pour le plugin et les explications associées.

  • YQL sur du DOM Le 28 janvier 2011 à 00:50 , par .Gilles

    Bonjour,

    j’utilise YQL pour traiter le DOM d’une page web. En pratique mon problème était de récupérer, pour la syndication, les actualités d’un site n’ayant pas de RSS. Le script YQL suivant permet de générer un fichier RSS en récupérant les infos présentes sur la page d’accueil du site en question.

    • YQL sur du DOM Le 28 janvier 2011 à 09:02 , par Fil

      Excellent ! merci du retour ; pour la date je vois que tu passes par du PHP, mais tu aurais aussi bien pu utiliser un filtre ?

    • YQL sur du DOM Le 28 janvier 2011 à 10:27 , par .Gilles

      Effectivement, un filtre perso aurait masqué le traitement PHP pour mettre la date au format ISO - avec le bénéfice de la mise en cache. Je ne pense pas qu’on pouvait le faire simplement avec des filtres SPIP classiques — et surtout c’était fait au plus vite ;-)

      Mais sans les itérateurs YQL, j’aurais été bien incapable de faire ce traitement pour récupérer des infos dans le DOM de la page. En tout cas pas sans passer par des scripts chevelus.

      C’est vraiment un superbe outils qui permet de récupérer n’importe quelle info externe !!

    • YQL sur du DOM Le 28 janvier 2011 à 10:34 , par .Gilles

      Ah, une dernière astuce :

      Pour ceux qui se demandent comment j’ai calculé le xpath de la requette YQL : je suis passé par Firebug. Il suffit de se positionner sur l’élément parent, dans l’inspecteur DOM, puis le menu conditionnel ("clic droit" pour PC) affiche l’option "Copier le chemin XPath". Facile, non ?

  • Exemples de boucles YQL Le 13 décembre 2011 à 22:26 , par Teddy

    Bonjour,

    Après avoir lu une certaine ébauche de présentation de SPIP 3… J’ai une question qui me taraude…

    Avec la puissance de la boucle DATA et les boucles YQL, est-ce qu’il serait possible d’imaginer un développement à la paper.li ?
    "Explications" : un plugin enregistre les hashtags de twitter qui m’intéressent et interroge l’url pour obtenir les résultats.
    Un autre plugin lit ces résultats et affiche un résumé de ces résultats pour les afficher sur ma page squelette…

    C’est faisable ?

    • Exemples de boucles YQL Le 13 décembre 2011 à 22:31

      Pour moi ça ne fait aucun doute que c’est possible ; quant à savoir comment, il faut peut-être essayer tout simplement la syndication ?

  • Exemples de boucles YQL Le 2 mars 2012 à 17:07 , par Suske

    Salut,

    Dans le texte et dans le code de Gilles, on trouve {datapath /query/results/video}. Cela passe en spip2.1 mais en spip3, ça pouiche : il faut retirer le premier / du datapath ({datapath query/results/video}).

     :-*

  • Exemples de boucles YQL Le 14 avril 2012 à 16:36 , par Suske

    Oui, peut-être mais factuellement, en spip3, je confirme que le premier / casse le bouzin...

  • Exemples de boucles YQL Le 8 juin 2012 à 16:07 , par Olivier

    Tiens, une petite découverte :

    Si on utilise un xpath comportant autre chose qu’une simple succession de balises, par exemple xpath='//*[@class="articles"]/div/ul/li', il faut absolument retirer les guillemets qui encadrent la requête yql.

  • Exemples de boucles YQL Le 7 juillet 2012 à 02:33 , par roger

    Bonjour,

    chez moi, avec spip 3.0.3, une requête sur le dom d’une page html (donc pas un web service),, "select * from html etc.", me laisse une page ’not found". En debug, je vois que la boucle ne ramène rien du tout de yahoo !!!, pourtant, via la console de yql, la même requête me ramène bien le résultat demandé ...

    une idée (la page est par exemple http://www.cumuleo.be/mandataire/11375-charles-picque.php)

    je cale,
    merci,
    RB

  • Exemples de boucles YQL Le 24 septembre 2012 à 18:26 , par Chrys

    Bonjour,

    Excellente cette boucle qui permet d’appeler des vidéos YouTube, j’aimerai l’adopter.

    Seulement je pose une question, est t’il possible d’afficher les vidéos suivant leur date de parution ? Tout comme les articles spip par exemple.

    Si oui, comment !? Merci à vous

    Chrys

  • Exemples de boucles YQL Le 28 septembre 2012 à 16:31 , par JS

    Bonjour,

    eh bien moi je n’arrive à rien avec le code suivant dont le but est de prendre dans un flux RSS simplement le lien et le titre.

    <BOUCLE_articles_dist(DATA)
                    {source yql, "select * from rss where url='http://monsite.fr/spip/?page=backend'"}
                    {datapath /channel/item }>
                    <li class="hentry">
                        <h3 class="entry-title"><a href="#VALEUR{link}" rel="bookmark">#VALEUR{title}</a></h3>
                        <div class="#EDIT{texte} texte entry-content">#VALEUR{content}</div>
                   </li>
               </BOUCLE_articles_dist>
    • Exemples de boucles YQL Le 29 septembre 2012 à 04:23 , par JS


      précision :

      il s’agit du flux rss d’un site distant que j’ai indiqué ici être du spip, mais pourrait-être autre chose, toujours sur le format rss