2012-02-02 9 views
19

मैं last.fm एपीआई के साथ बातचीत के लिए एक छोटी लिपि लिखने की कोशिश कर रहा हूं।ElementTree findall() खाली सूची लौट रहा है

मेरे पास ElementTree के साथ काम करने का एक छोटा सा अनुभव है, लेकिन जिस तरह से मैंने इसे पहले इस्तेमाल किया वह काम नहीं कर रहा है, बल्कि यह एक खाली सूची देता है।
मैंने एपीआई कुंजी को हटा दिया क्योंकि मुझे नहीं पता कि यह कितना निजी होना चाहिए, और एक्सएमएल का एक उदाहरण दिया है जिसे मैं इसके स्थान पर प्राप्त कर रहा हूं।

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 

कॉल Last_fmWrapper() की विधि get_now_playing करने के लिए:: एपीआई के साथ बातचीत के लिए

कक्षा

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) 

एक्सएमएल का नमूना मैं प्राप्त करते हैं:

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

उत्तर

33

समस्या यह है कि findallonly searches the immediate descendants of an element if it is given a tag name। आपको इसे एक XPath अभिव्यक्ति देने की आवश्यकता है जो इसके नीचे के पेड़ में कहीं भी track पायेगी। तो निम्नलिखित कार्य करना चाहिए, उदाहरण के लिए:

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

धन्यवाद! अब आकर्षक के रूप में काम करता है! – Cirno

+0

@Cirno: बढ़िया, कोई समस्या नहीं :) चूंकि इससे आपकी समस्या हल हो गई है, तो यह अच्छा होगा अगर आप [उत्तर को स्वीकार करें] (http://meta.stackexchange.com/a/5235) मेरे द्वारा ✔ पर क्लिक करके जवाब। –

+1

हाय, उत्तर के लिए धन्यवाद। मुझे इस तरह कुछ खोजने की ज़रूरत है: "{http://purl.org/rss/1.0/}item" टैग नाम - "आइटम" द्वारा। नामस्थान को अनदेखा कर रहा है। मैंने कोशिश की है: findall ('.//{*} आइटम') लेकिन यह काम नहीं करेगा। कोई उपाय? मुझे http://bugs.python.org/issue18304#msg194896 – Kostanos