22

有人可以帮我处理这段代码吗?我正在尝试制作一个可以播放视频的 python 脚本,我发现这个文件可以下载 Youtube 视频。我不完全确定发生了什么,我无法弄清楚这个错误。

错误:

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

追溯:

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
4

4 回答 4

28

错误在您的第 11 行,您re.search没有返回任何结果,即None,然后您尝试调用fmtre.groupbut fmtreis 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
于 2013-02-26T02:02:20.843 回答
4

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
于 2013-02-26T02:04:35.703 回答
0

只是想在这种情况下提到新的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

其他语言以前也有这个(想想Cor PHP),但 imo 它使代码更清晰。


对于上面的代码,这可能是

def getVideoUrl(content):
    if (fmtre := re.search('(?<=fmt_url_map=).*', content)) is None:
        return None
    ...
于 2019-05-22T11:03:53.717 回答
0

只是想补充一下答案,一组数据应该是一个序列,所以你可以匹配分组数据的每个部分而不会跳过一个数据,因为如果从一个句子中跳过一个单词,我们可能不会参考该句子不再是一组,请参阅下面的示例以获得更多说明,但是不推荐使用 compile 方法。

msg = "Malcolm reads lots of books"

#The below code will return an error.

book = re.compile('lots books')
book = re.search(book, msg)
print (book.group(0))

#The below codes works as expected

book = re.compile ('of books')
book = re.search(book, msg)
print (book.group(0))

#Understanding this concept will help in your further 
#researchers. Cheers.
于 2020-05-13T13:46:59.883 回答