2012-02-02 25 views
19

Last.fm API ile etkileşimde bulunmak için küçük bir komut dosyası yazmaya çalışıyorum.ElementTree findall() boş liste döndürüyor

ElementTree ile çalışırken biraz deneyimim var, ancak daha önce kullandığım şekilde çalışmıyor gibi görünüyor, bunun yerine boş bir liste döndürüyor.
API anahtarını, özel olarak nasıl olması gerektiğini bilmediğim gibi kaldırdım ve burada aldığım XML örneğini verdim. Last_fmWrapper() yöntemini get_now_playing için

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 

Çağrısı: API ile etkileşim için

Sınıf xml

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) 

Numune ben alırsınız:

<?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> 

cevap

33

Sorun şu ki findallonly searches the immediate descendants of an element if it is given a tag name. Altında ağacın herhangi bir yerinde track'u bulacak bir XPath ifadesi vermeniz gerekir. Yani aşağıdaki gibi çalışılmalıdır, örneğin:

api_results = ElementTree.parse(response).findall('.//track') 
+0

Teşekkürler! şimdi bir çekicilik gibi çalışır! – Cirno

+0

@Cirno: harika, sorun değil :) Sorununuzu çözdüğünüze göre, [yanıtı kabul etseydiniz] (http://meta.stackexchange.com/a/5235) 'ı tıklayarak Cevap. –

+1

Merhaba, cevabınız için teşekkürler. Bunun gibi bir şey bulmam gerekiyor: "{http://purl.org/rss/1.0/}item" etiket adında - "item". Ad alanını göz ardı etmek. Ben denedim: findall ('.//{*} öğe') ama işe yaramaz. Herhangi bir fikir? http://bugs.python.org/issue18304#msg194896 – Kostanos