Объект 'NoneType' не имеет атрибута 'group'

Может кто-нибудь помочь мне с этим кодом? Я пытаюсь сделать python script, который будет воспроизводить видео, и я нашел этот файл, который загружает видео Youtube. Я не совсем уверен, что происходит, и я не могу понять эту ошибку.

Ошибка:

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;')

Фрагмент кода:

(строки 66-71)

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

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

(строки 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

Ответ 1

Ошибка в вашей строке 11, ваш re.search не возвращает никаких результатов, т.е. None, а затем вы пытаетесь вызвать fmtre.group, но fmtre есть None, поэтому AttributeError.

Вы можете попробовать:

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

Ответ 2

Вы используете regex для соответствия URL-адресу, но он не может совпадать, поэтому результат None

и None не имеет атрибута group

Вы должны добавить код detect к результату

Если он не может соответствовать правилу, он не должен работать под кодом

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

Ответ 3

Просто хотел упомянуть нового оператора walrus в этом контексте, потому что этот вопрос часто помечается как дубликат.


До Python 3.8 нам нужно было:
match = re.search(pattern, string, flags)
if match:
    # do sth. useful here

Начиная с Python 3.8 мы можем написать так же, как:

if (match := re.search(pattern, string, flags)) is not None:
    # do sth. with match

Другие языки имели это раньше (например, C или PHP), но, по-моему, это делает код чище.