web-dev-qa-db-fra.com

Elementtree Windowall () Retourner la liste vide

J'essaie d'écrire un petit script pour interagir avec l'API Last.fm.

J'ai une petite expérience de travail avec ElementTree, mais la façon dont je l'ai utilisée auparavant ne semble pas fonctionner, elle renvoie plutôt une liste vide.
[.____] J'ai supprimé la clé API car je ne sais pas exactement à quel point cela devrait être privé et donné un exemple du XML que je reçois dans sa place.

Classe pour interagir avec API:

from xml.etree import ElementTree
import urllib
import urllib2

class Last_fmWrapper(object):
    def __init__(self):
        self.last_fm_api_key = '*****************************'
        self.api_url = 'http://ws.audioscrobbler.com/2.0/'
    def get_now_playing(self, last_fm_user, method):
        self.last_fm_user = last_fm_user
        self.method = method
        parameters = {'user':self.last_fm_user, 'api_key':self.last_fm_api_key, 'method':self.method}
        encoded_parameters = urllib.urlencode(parameters)
        request = urllib2.Request(self.api_url, encoded_parameters)
        response = urllib2.urlopen(request)
        api_results = ElementTree.parse(response).findall('track')
        # why does api_results == []?

    def compare_tasteometer(self):
        pass

    def register_user(self):
        pass

Appelez la méthode de get_now_playing de Last_fmWrapper():

from last_fm_wrapper import Last_fmWrapper
last_fm = Last_fmWrapper()
now_playing = last_fm.get_now_playing('BiriBiriRG', 'user.getRecentTracks')
if now_playing == None:
    print 'You not currently playing anything.'
else:
    print 'You are now playing {}'.format(now_playing)

Échantillon de XML Je reçois:

<?xml version="1.0" encoding="utf-8"?>
<lfm status="ok">
<recenttracks user="BiriBiriRG" page="1" perPage="10" totalPages="18406" total="184058" >
<track> 
                <artist mbid="01809552-4f87-45b0-afff-2c6f0730a3be">Elvis Presley</artist>
<name>Thrill Of Your Love</name>
<streamable>1</streamable>
<mbid></mbid>
        <album mbid="c445fa3a-3b24-41d4-b955-b6ca560c6f7a">Love Songs</album>
    <url>http://www.last.fm/music/Elvis+Presley/_/Thrill+Of+Your+Love</url>
    <image size="small">http://userserve-ak.last.fm/serve/34s/69037914.png</image>
    <image size="medium">http://userserve-ak.last.fm/serve/64s/69037914.png</image>
    <image size="large">http://userserve-ak.last.fm/serve/126/69037914.png</image>
    <image size="extralarge">http://userserve-ak.last.fm/serve/300x300/69037914.png</image>
        <date uts="1328153196">2 Feb 2012, 03:26</date>
</track>
<track> 
                <artist mbid="efc8a006-d0c6-4a9b-8cb1-91ca770fa2b9">Colbie Caillat</artist>
<name>Oxygen</name>
<streamable>1</streamable>
<mbid></mbid>
        <album mbid="2d297b29-a215-42fe-8a8c-dc8b502903b1">Coco</album>
    <url>http://www.last.fm/music/Colbie+Caillat/_/Oxygen</url>
    <image size="small">http://userserve-ak.last.fm/serve/34s/69229764.png</image>
    <image size="medium">http://userserve-ak.last.fm/serve/64s/69229764.png</image>
    <image size="large">http://userserve-ak.last.fm/serve/126/69229764.png</image>
    <image size="extralarge">http://userserve-ak.last.fm/serve/300x300/69229764.png</image>
        <date uts="1328152962">2 Feb 2012, 03:22</date>
</track>
<track> 
24
Cirno

Le problème est que findallrecherche uniquement les descendants immédiats d'un élément s'il reçoit un nom de balise . Vous devez lui donner une expression XPath qui trouvera track n'importe où dans l'arbre en dessous de cela. Ce qui suit devrait donc fonctionner, par exemple:

api_results = ElementTree.parse(response).findall('.//track')
50
Mark Longair