Объект '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('&')
Фрагмент кода:
(строки 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('&')
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('&')
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('&')
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
), но, по-моему, это делает код чище.