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

2 投票
1 回答
2113 浏览
提问于 2025-04-18 00:25

这段代码的目的是在一个列表中找到第一个包含三个字符串之一的子元素,这三个字符串是:'fanart'、'graphical' 或 'poster'。如果找到其中一个字符串,我就把包含网址文本的元素标签添加到一个列表中,然后继续查找下一个字符串。最终,我希望能得到三个字符串,每个字符串对应一个图片的网址,这样我就可以下载这三张图片了。不过,这个函数返回的列表里只有一个项目,而不是三个,我不知道为什么。有人能告诉我我哪里做错了吗?为了更清楚,我还附上了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 个回答

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_) 这行代码应该能确保你只返回每种类型的第一个匹配项。

撰写回答