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.groupが、はです。fmtreNoneAttributeError

あなたは試すことができます:

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

他の言語は以前にこれを持っていました(Cまたはを考えPHPてください)が、それはよりクリーンなコードになります。


上記のコードの場合、これは次のようになります。

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

回答に追加したいだけですが、データのグループは順番に並んでいることが期待されます。そのため、データをスキップせずにグループ化されたデータの各セクションを一致させることができます。これは、単語が文からスキップされた場合、参照できない場合があるためです。文はもう1つのグループになっています。詳細については、以下の例を参照してください。ただし、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 に答える