2013-02-26 3 views
7

Qualcuno può aiutarmi con questo codice? Sto cercando di creare uno script python che riproduca i video e ho trovato questo file che scarica i video di YouTube. Non sono completamente sicuro di quello che sta succedendo e non riesco a capire questo errore.L'oggetto 'NoneType' non ha attributo 'group'

Errore:

AttributeError: 'NoneType' object has no attribute 'group' 

Traceback:

Traceback (most recent call last): 
    File "youtube.py", line 67, in <module> 
    videoUrl = getVideoUrl(content) 
    File "youtube.py", line 11, in getVideoUrl 
    grps = fmtre.group(0).split('&amp;') 

Snippet di codice:

(linee 66-71)

content = resp.read() 
videoUrl = getVideoUrl(content) 

if videoUrl is not None: 
    print('Video URL cannot be found') 
    exit(1) 

(linee 9-17)

def getVideoUrl(content): 
    fmtre = re.search('(?<=fmt_url_map=).*', content) 
    grps = fmtre.group(0).split('&amp;') 
    vurls = urllib2.unquote(grps[0]) 
    videoUrl = None 
    for vurl in vurls.split('|'): 
     if vurl.find('itag=5') > 0: 
      return vurl 
    return None 
+0

@omouse Vuoi vedere tutto il mio codice? La domanda è stata risolta – David

+7

Sto ovviamente cercando di imparare, non c'è bisogno di essere così critico – David

risposta

12

L'errore è nella vostra linea 11, il tuo re.search sta tornando alcun risultato, vale a dire None, e quindi si sta cercando di chiamare fmtre.group ma fmtre è None, da cui il AttributeError.

Si potrebbe provare:

def getVideoUrl(content): 
    fmtre = re.search('(?<=fmt_url_map=).*', content) 
    if fmtre is None: 
     return None 
    grps = fmtre.group(0).split('&amp;') 
    vurls = urllib2.unquote(grps[0]) 
    videoUrl = None 
    for vurl in vurls.split('|'): 
     if vurl.find('itag=5') > 0: 
      return vurl 
    return None 
+0

Questo funziona. Per qualche motivo non riconosce l'URL ora. È ora di capirlo ... – David

1

È utilizzare regex per abbinare l'url, ma non può corrispondere, in modo che il risultato è None

e None tipo non ha l'attributo group

si dovrebbe aggiungere un po 'di codice per detect il risultato

Se non può corrispondere la regola, non dovrebbe andare sotto codice

def getVideoUrl(content): 
    fmtre = re.search('(?<=fmt_url_map=).*', content) 
    if fmtre is None: 
     return None   # if fmtre is None, it prove there is no match url, and return None to tell the calling function 
    grps = fmtre.group(0).split('&amp;') 
    vurls = urllib2.unquote(grps[0]) 
    videoUrl = None 
    for vurl in vurls.split('|'): 
     if vurl.find('itag=5') > 0: 
      return vurl 
    return None