2014-03-29 3 views
2

이 코드는 세 개의 문자열 중 하나를 포함하는 하위 요소가있는 목록의 첫 번째 요소를 찾습니다. ' 팬트 ','그래픽 '또는'포스터 '. 이 문자열 중 하나를 찾으면 URL의 텍스트가 들어있는 elements 태그를 목록에 추가하고 movie는 다음 문자열로 추가합니다. 최종 결과는 3 개의 URL을 포함하는 3 개의 문자열을 3 개의 이미지로 가져 와서 다운로드합니다. 그러나이 함수는 3이 아닌 1 항목으로 목록을 반환하며 이유는 알 수 없습니다. 누군가 제가 잘못하고있는 것을 지적 할 수 있습니까? 명확히하기 위해 XML 파일 구조도 포함했습니다.ElementTree, Python - 특정 텍스트를 포함하는 하위 요소가있는 요소를 찾고 목록에 다른 하위 요소 추가

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> 
+0

여기서 'urls.extend'를 사용 하시겠습니까? 순진하게 말하자면 '추가'가되어야합니다. 또한, 변수 이름에'type'과 같은 파이썬 키워드를 사용하지 말아야합니다. – ebarr

+0

@ebarr 좋은 점이 다른 varibale 이름으로 변경되었습니다. 고마워, 그래, 그것은 덧붙여 야했다 : –

답변

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_) 문 당신은 단지 당신의 세 가지 유형 각각에 첫 경기를 반환 있는지 확인해야합니다 :

나는 당신이 또한 하나의 루프에 모든 것을 넣어 다소 코드를 압축 할 수 있다고 생각합니다.

+0

그 종류의 고정 그것과 종류의 그것을 고치지 않았다. 이제 빈 목록을 반환하는 대신 3 개가 아닌 하나의 항목이있는 목록을 반환합니다. 원본 게시물의 코드와 설명을 업데이트합니다. –

+0

몇 가지 업데이트 된 코드를 추가했습니다. 얼마나 많은 "배너"요소가 findall 문을 코드에서 찾습니다. 즉'len (root.findall ("Banner")) =?'. – ebarr

+0

모두 괜찮아요, 나는 일할 수 있었다 :) –

관련 문제