Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

grep & regex

8 réponses
Avatar
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

8 réponses

Avatar
Méta-MCI \(MVP\)
Bonsoir !

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

txt='<enclosure url="http://foo.org/bar.mp3" type="audio/mpeg" />'
print txt.split('"')[1]

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

@-salutations

Michel Claveau
Avatar
Anthony
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)'



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.

Avatar
MC
'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

Avatar
NicolasP

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

Avatar
Jerome
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


Avatar
kael
Méta-MCI (MVP) wrote:
Bonsoir !


Bonjour,

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

txt='<enclosure url="http://foo.org/bar.mp3" type="audio/mpeg" />'
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 <http://www.oreillynet.com/lpt/a/4679> :

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

Avatar
Jerome
kael wrote:
Méta-MCI (MVP) wrote:
Bonsoir !


Bonjour,

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

txt='<enclosure url="http://foo.org/bar.mp3" type="audio/mpeg" />'
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 <http://www.oreillynet.com/lpt/a/4679> :

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


Avatar
kael
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 <http://www.oreillynet.com/lpt/a/4679> :

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
<http://ask.metafilter.com/62318/Strip-me-some-mp3-urls#938507> ainsi
qu'un script pour parser le RSS
<http://www.learningpython.com/sources/pythonRSS.txt>.

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