ElementTree,Python - 查找包含特定文本的子元素的元素,并将另一个子元素添加到列表中

时间:2014-03-29 10:24:46

标签: python xml list elementtree

此代码用于查找列表中的第一个元素,该元素包含一个包含三个字符串之一的子元素:'fanart','graphical'或'poster'。如果我找到其中一个字符串,我会将包含URL文本的元素标记添加到列表中,并将电影添加到下一个字符串中。最终结果是我得到3个包含3个URL到3个图像的字符串,然后我将下载。但是,此函数返回一个包含1个项而不是3个的列表,我不知道为什么。有人能指出我做错了什么吗?为清楚起见,我还包括了XML文件结构。

def get_banner(target):
    #Finds urls of show images
    urls = []
    types = ['fanart', 'graphical', 'poster']
    tree = et.parse(target)
    root = tree.getroot()
    for banner in root.findall('Banner'):
        url = 'http://thetvdb.com/banners/' + banner.find('BannerPath').text
        type_ = banner.find('BannerType').text
        print url
        if type_ == types[0]:
            urls.append(url)
            break
    for banner in root.findall('banner'):
        url = 'http://thetvdb.com/banners/' + banner.find('BannerPath').text
        type_ = banner.find('BannerType').text
        print url
        if type_ == types[1]:
            urls.append(url)
            break
    for banner in root.findall('banner'):
        url = 'http://thetvdb.com/banners/' + banner.find('BannerPath').text
        type_ = banner.find('BannerType').text
        if type_ == types[2]:
            urls.append(url)
            break
    return urls

<Banners>
    <Banner>
      <id>406321</id>
      <BannerPath>fanart/original/81189-21.jpg</BannerPath>
      <BannerType>fanart</BannerType>
      <BannerType2>1920x1080</BannerType2>
      <Colors>|234,222,110|0,0,0|103,103,103|</Colors>
      <Language>en</Language>
      <Rating>7.0930</Rating>
      <RatingCount>43</RatingCount>
      <SeriesName>false</SeriesName>
      <ThumbnailPath>_cache/fanart/original/81189-21.jpg</ThumbnailPath>
      <VignettePath>fanart/vignette/81189-21.jpg</VignettePath>
    </Banner>
</Banners>

1 个答案:

答案 0 :(得分:1)

简单回答:

root.findall('banner') != root.findall('Banner')

XML标记区分大小写。

我认为您也可以通过将所有内容放在一个循环中来稍微压缩您的代码:

def get_banner(target):
    #Finds urls of show images                                                                  
    urls = []
    types = ['fanart', 'graphical', 'poster']
    tree = et.parse(target)
    root = tree.getroot()
    for banner in root.findall('Banner'):
        url = 'http://thetvdb.com/banners/' + banner.find('BannerPath').text
        type_ = banner.find('BannerType').text
        if not types:
            break
        elif type_ in types:
            urls.append(url)
            types.remove(type_)
    return urls

types.remove(type_)语句应该确保您只返回三种类型中的每一种匹配。