1

我编写了代码来获取不同文本文件中的播放列表和其中的视频列表:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""

YouTube Playlist Extrator.
A tool to extract playlists from YouTube API which in todays YouTube page format is very difficult to extract.
It also extracts video lists per playlist and hence takes bit longer to run for long playlists.

"""


#from profiler import Profiler
from xml.dom.minidom import parseString
import os

try:
    import urllib.request as urlLibReq
    PY3 = True
except:
    import urllib as urlLibReq
    PY3 = False

def getInput():
    if PY3:
        return input("Enter username of YouTube channel: ")
    elif not PY3:
        return raw_input("Enter username of YouTube channel: ")

def xmlParser(url):
  page = urlLibReq.urlopen(url)
  text = page.read().decode("utf8")
  return parseString(text)

def extractplaylist(userId):
    url = "https://gdata.youtube.com/feeds/api/users/"+ userId +"/playlists?v=2"
    dom = xmlParser(url)
    total = int(dom.getElementsByTagName("openSearch:totalResults")[0].firstChild.nodeValue)
    startIndex, listEntry = 1 , []
    while startIndex <= total:
        url_new = url + "&max-results=50&start-index="+ str(startIndex)
        dom = xmlParser(url_new)
        entry = dom.getElementsByTagName("entry")
        for node in entry:
            id_data = node.getElementsByTagName("id")[0].firstChild.nodeValue
            id_split = id_data.split(':')
            playlist_id = id_split[5]
            playlist_title = node.getElementsByTagName("title")[0].firstChild.nodeValue
            extractvideolist(userId, playlist_id, playlist_title)
            listEntry.append(str(playlist_title))
            startIndex += 1
    listEntry.sort()
    writer = open(userId+"_playlist.txt","w")
    writer.write("\r\n".join(map(str, listEntry)))
    writer.close()

def extractvideolist(userId, playlist_id, playlist_title):
    url = "http://gdata.youtube.com/feeds/api/playlists/"+ playlist_id +"?v=2"
    dom = xmlParser(url)
    total = int(dom.getElementsByTagName("openSearch:totalResults")[0].firstChild.nodeValue)
    startIndex, listEntry = 1 , []
    while startIndex <= total:
        url_new = url + "&max-results=50&start-index="+ str(startIndex)
        dom = xmlParser(url_new)
        entry = dom.getElementsByTagName("entry")
        for node in entry:
            video_title = node.getElementsByTagName("title")[0].firstChild.nodeValue
            listEntry.append(str(video_title))
            startIndex += 1
    playlist_title = playlist_title.replace("'","\'")
    writer = open(playlist_title+"_videolist.txt","w")
    writer.write("\r\n".join(map(str, listEntry)))
    writer.close()
    print("written", playlist_title)
    try: os.mkdir(userId)
    except: pass
    os.system('mv "'+ playlist_title +'_videolist.txt" '+ userId)


if __name__ == "__main__":
    name = getInput()
    extractplaylist(name)
    #Profiler.report()

当播放列表中有删除的视频时,代码会失败。我该如何处理这样的事情?

4

1 回答 1

0

尝试在 for 循环中添加 else 子句,以便在 for 循环结束时跳出 while 循环。

while startIndex <= total:
    url_new = url + "&max-results=50&start-index="+ str(startIndex)
    dom = xmlParser(url_new)
    entry = dom.getElementsByTagName("entry")
    for node in entry:
        id_data = node.getElementsByTagName("id")[0].firstChild.nodeValue
        id_split = id_data.split(':')
        playlist_id = id_split[5]
        playlist_title = node.getElementsByTagName("title")[0].firstChild.nodeValue
        extractvideolist(userId, playlist_id, playlist_title)
        listEntry.append(str(playlist_title))
        startIndex += 1
    else:
        break
于 2013-11-11T15:57:30.457 回答