grep & regex

Le
kael
Bonjour,

Ma question ne concerne pas directement Python, mais grep et regex dans
un script Python.

Je souhaite extraire des fichiers MP3 à partir d'un flux RSS avec
<enclosure> du type :

<item>
<title>foobar</title>
<link>http://foo.org/foobar</link>
<description></description>
<enclosure url="http://foo.org/bar.mp3" type="audio/mpeg" />
</item>

J'utilise les commandes suivantes :

curl -s 'http://foo.org/rss' | grep -E '(<enclosure)'

et j'obtiens une liste du type :

<enclosure url="http://foo.org/bar.mp3" type="audio/mpeg" />

Comment ne récupérer que l'url du MP3 ?

Merci.

--
kael
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Méta-MCI \(MVP\)
Le #645152
Bonsoir !

Pas forcément besoin d'une RegEx.
Exemple :

txt=' print txt.split('"')[1]

Je précise :
...split(apostrophe-guillemetdouble-apostrophe)...

@-salutations

Michel Claveau
Anthony
Le #645151
Bonjour,

Ma question ne concerne pas directement Python, mais grep et regex dans
un script Python.

Je souhaite extraire des fichiers MP3 à partir d'un flux RSS avec
<enclosure> du type :

<item>
<title>foobar</title>
<description></description>
</item>

J'utilise les commandes suivantes :

curl -s 'http://foo.org/rss' | grep -E '(<enclosure)'



Le mieux ce serait quand même de récupérer le flux avec urllib, puis de
parser le xml avec xml.dom.minidom par exemple.

MC
Le #645149
'soir !


Le mieux ce serait de récupérer le flux avec urllib, puis de
parser le xml avec xml.dom.minidom par exemple.


Sûr ; et même, avec la mode actuelle des RSS, il doit bien y avoir des
modules (en Python) qui font tout (et même le KFé-rss)
















--
@-salutations

Michel Claveau

NicolasP
Le #644921

Le mieux ce serait quand même de récupérer le flux avec urllib, puis de
parser le xml avec xml.dom.minidom par exemple.


Avec elementTree, c'est encore plus facile.
ElementTree est intégré à Python 2.5.

Nicolas

Jerome
Le #644920
MC wrote:
'soir !


Le mieux ce serait de récupérer le flux avec urllib, puis de
parser le xml avec xml.dom.minidom par exemple.


Sûr ; et même, avec la mode actuelle des RSS, il doit bien y avoir des
modules (en Python) qui font tout (et même le KFé-rss)


En googlant on trouve ça http://feedparser.org/

Sinon n'importe quelle librairie qui gère du xml doit te permettre de
trouver tes petits avec une expression xpath //item/enclosure/@url


kael
Le #644919
Méta-MCI (MVP) wrote:
Bonsoir !


Bonjour,

Pas forcément besoin d'une RegEx.
Exemple :

txt=' print txt.split('"')[1]

Je précise :
...split(apostrophe-guillemetdouble-apostrophe)...


Merci à tous pour vos suggestions.

Mais étant novice en shell et python, je ne m'en sors pas.

Je me suis inspiré de ce howto
rss_data = "curl -s 'http://hypem.com/playlist/search/' + song.author +
song.title + '/rss/1/feed.xml' | grep -E '(enclosure>|url>)'"

Et je ne sais pas parser le résultat pour récupérer le 1er mp3.

En fait, on m'a donné un script en python qui scrap une playlist de
morceaux diffusés à la radio.

Et je voudrais récupérer automatiquement le morceau s'il existe sur des
sites tel que The Hype Machine.

Mais je rencontre plusieurs problèmes, notamment construire une url
correcte. Pour l'url, j'ai trouvé :

if author.find(" "):
author = author.replace(" ", "+")

Mais cela ne suffit.

Et après, il faut que j'apprenne à écrire un timer.

C'est compliqué tout ça.

--
kael

Jerome
Le #644918
kael wrote:
Méta-MCI (MVP) wrote:
Bonsoir !


Bonjour,

Pas forcément besoin d'une RegEx.
Exemple :

txt=' print txt.split('"')[1]

Je précise :
...split(apostrophe-guillemetdouble-apostrophe)...


Merci à tous pour vos suggestions.

Mais étant novice en shell et python, je ne m'en sors pas.


Je ne comprends pas ce que tu souhaites faire en shell et ce que tu
souhaites faire en python.


Je me suis inspiré de ce howto
rss_data = "curl -s 'http://hypem.com/playlist/search/' + song.author +
song.title + '/rss/1/feed.xml' | grep -E '(enclosure>|url>)'"


Si c'est du python tu créés une chaine qui contient les sous-chaines
'song.author' et 'song.title', pas le contenu de la variable.

url_str = 'http://hypem.com/playlist/search/' + song.author + song.title
+ '/rss/1/feed.xml'
rss_data = "curl -s %s | grep -E '(enclosure>|url>)'" % url_str


mais en faisant cela tu n'appelles pas les commandes curl et grep.
Il faut :
- soit que tu passes par des os.popen pour exécuter la ligne de
commande et récupérer le résultat
- soit que tu passes par urllib2 pour récupérer le flux rss et
ensuite le parser. Cela revient faire en python ce que font tes
commandes grep et curl
- soit que tu récupères le flux xml directement avec une librairie
adéquate. Feedparser à l'air de le faire, libxml2 le fait aussi



Et je ne sais pas parser le résultat pour récupérer le 1er mp3.


Ca dépend du choix que tu vas faire avant


En fait, on m'a donné un script en python qui scrap une playlist de
morceaux diffusés à la radio.


scrap ?


Et je voudrais récupérer automatiquement le morceau s'il existe sur des
sites tel que The Hype Machine.

Mais je rencontre plusieurs problèmes, notamment construire une url
correcte. Pour l'url, j'ai trouvé :

if author.find(" "):
author = author.replace(" ", "+")

Mais cela ne suffit.

Et après, il faut que j'apprenne à écrire un timer.


http://www.python.org/doc/2.2.1/lib/timer-objects.html


C'est compliqué tout ça.



mais non :)


kael
Le #644138
Jerome wrote:
kael wrote:
Mais étant novice en shell et python, je ne m'en sors pas.


Je ne comprends pas ce que tu souhaites faire en shell et ce que tu
souhaites faire en python.


En fait, en parlant du shell, je fais réference à grep, sed, etc.

Je me suis inspiré de ce howto
rss_data = "curl -s 'http://hypem.com/playlist/search/' + song.author +
song.title + '/rss/1/feed.xml' | grep -E '(enclosure>|url>)'"


Si c'est du python tu créés une chaine qui contient les sous-chaines
'song.author' et 'song.title', pas le contenu de la variable.

url_str = 'http://hypem.com/playlist/search/' + song.author + song.title
+ '/rss/1/feed.xml'
rss_data = "curl -s %s | grep -E '(enclosure>|url>)'" % url_str

mais en faisant cela tu n'appelles pas les commandes curl et grep.
Il faut :
- soit que tu passes par des os.popen pour exécuter la ligne de
commande et récupérer le résultat
- soit que tu passes par urllib2 pour récupérer le flux rss et ensuite
le parser. Cela revient faire en python ce que font tes commandes grep
et curl
- soit que tu récupères le flux xml directement avec une librairie
adéquate. Feedparser à l'air de le faire, libxml2 le fait aussi


Merci.

J'ai trouvé un mini howto pour utiliser xml.dom
qu'un script pour parser le RSS

J'arrive à afficher la liste des liens avec print (print link) mais
lorsque je créé une variable avec la liste des liens et que j'utilise
cette variable, seul le premier lien est affiché, et non la liste.

Y'a probablement une array à créer avec un loop, mais j'ai pas encore
compris comment faire.

En fait, on m'a donné un script en python qui scrap une playlist de
morceaux diffusés à la radio.


scrap ?


Récupérer une page HTML et parser que ce qui intéresse - comme parfois
il n'y a pas d'API pour accéder aux data. :)

Et après, il faut que j'apprenne à écrire un timer.


http://www.python.org/doc/2.2.1/lib/timer-objects.html


Merci.

En fait, je n'arrivais pas à faire fonctionner le timer parce que
j'avais nommé le fichier time.py...

J'ai trouvé deux exemples :

import time

nb
i=0
for i in range(nb):
time.sleep(5)
print "hello"

et

import threading
def hello():
print "hello, world"
nbr0
for i in range(nb):
t = threading.Timer(10.0, hello)
t.start()
while t.isAlive(): continue
#del t

Mais je ne trouve pas comment répéter une action un nombre illimité de fois.

C'est compliqué tout ça.


mais non :)


Bah, un p'tit peu quand même. :)

Mais une fois que l'on commence à se familiariser, ça devient un peu
plus facile.

J'ai encore une question.

Avec les commandes suivantes j'obtiens :

import urllib2,commands,sys,os

link = "http://example.org"
tinyurl = urllib2.urlopen("http://tinyurl.com/create.php?url=" + link)
foo = sys.stdout.write(str(tinyurl)) # pas forcément réglementaire.
$ <addinfourl at 136703724 whose fp = <socket._fileobject object at
0x825fdf4>>

Comment faire pour afficher l'url créée ?

--
kael


Publicité
Poster une réponse
Anonyme