python - ElementTree findall() 返回空列表

标签 python xml elementtree last.fm

我正在尝试编写一个用于与 last.fm API 交互的小脚本。

我有一点使用 ElementTree 的经验,但我以前使用它的方式似乎不起作用,而是返回一个空列表。
我删除了 API key ,因为我不知道它应该有多私密,并给出了一个我收到的 XML 的示例。

与 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

调用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 示例:

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

最佳答案

问题是 findall only searches the immediate descendants of an element if it is given a tag name .您需要为其提供一个 XPath 表达式,该表达式将在其下方的树中的任何位置找到 track。因此,以下应该可以工作,例如:

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

关于python - ElementTree findall() 返回空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9112121/

相关文章:

xml - 通过菜单按钮调用首选项时强制关闭消息

python - 在python中创建XML文件节点丢失

python - 如何为具有特定属性值的xml元素选择数据?

python - Kivy Ios ./toolchain.py 构建 kivy 不工作

python - 如何在 PySpark 中分别对多个列进行透视

python - Windows 中的 Jenkins 在激活 Python VENV 后停止

python - 使用 XPATH 处理格式错误的 HTML 文件

python - Pandas:如何屏蔽连续行后的第一行?

java - 奇怪的 xml 解析行为

java - 什么是从 Java 生成任意 XML 的好库?