Как извлечь идентификатор видео из ссылки YouTube в Python? - PullRequest
20 голосов
/ 05 декабря 2010

Я знаю, что это легко сделать с помощью функций PHP parse_url и parse_str:

$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
$url = parse_url($subject);
parse_str($url['query'], $query);
var_dump($query);

Но как этого добиться с помощью Python? Я могу сделать urlparse, но что дальше?

Ответы [ 7 ]

47 голосов
/ 29 октября 2011

Я создал анализатор идентификаторов YouTube без регулярного выражения:

def video_id(value):
    """
    Examples:
    - http://youtu.be/SA2iWivDJiE
    - http://www.youtube.com/watch?v=_oPAwA_Udwc&feature=feedu
    - http://www.youtube.com/embed/SA2iWivDJiE
    - http://www.youtube.com/v/SA2iWivDJiE?version=3&hl=en_US
    """
    query = urlparse(value)
    if query.hostname == 'youtu.be':
        return query.path[1:]
    if query.hostname in ('www.youtube.com', 'youtube.com'):
        if query.path == '/watch':
            p = parse_qs(query.query)
            return p['v'][0]
        if query.path[:7] == '/embed/':
            return query.path.split('/')[2]
        if query.path[:3] == '/v/':
            return query.path.split('/')[2]
    # fail?
    return None
41 голосов
/ 05 декабря 2010

В Python есть библиотека для разбора URL .

import urlparse
url_data = urlparse.urlparse("http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1")
query = urlparse.parse_qs(url_data.query)
video = query["v"][0]
9 голосов
/ 06 января 2015

Здесь RegExp покрывает эти случаи enter image description here

((?<=(v|V)/)|(?<=be/)|(?<=(\?|\&)v=)|(?<=embed/))([\w-]+)

4 голосов
/ 05 декабря 2010
match = re.search(r"youtube\.com/.*v=([^&]*)", "http://www.youtube.com/watch?v=z_AbfPXTKms&test=123")
if match:
    result = match.group(1)
else:
    result = ""

Непроверенные.

2 голосов
/ 05 декабря 2010

Вот кое-что, что вы можете попробовать использовать регулярное выражение для идентификатора видео YouTube:

# regex for the YouTube ID: "^[^v]+v=(.{11}).*"
result = re.match('^[^v]+v=(.{11}).*', url)
print result.group(1)
2 голосов
/ 05 декабря 2010

Нет необходимости в регулярных выражениях. Разделитесь на ?, возьмите второе, разделите на =, возьмите второе, разделите на &, возьмите первое.

0 голосов
/ 27 января 2019

Я сделал решение Михаила Кашкина Python3 дружественным

from urllib.parse import urlparse

def video_id(url):
    """
    Examples:
    - http://youtu.be/SA2iWivDJiE
    - http://www.youtube.com/watch?v=_oPAwA_Udwc&feature=feedu
    - http://www.youtube.com/embed/SA2iWivDJiE
    - http://www.youtube.com/v/SA2iWivDJiE?version=3&amp;hl=en_US
    """
    o = urlparse(url)
    if o.netloc == 'youtu.be':
        return o.path[1:]
    elif o.netloc in ('www.youtube.com', 'youtube.com'):
        if o.path == '/watch':
            id_index = o.query.index('v=')
            return o.query[id_index+2:id_index+13]
        elif o.path[:7] == '/embed/':
            return o.path.split('/')[2]
        elif o.path[:3] == '/v/':
            return o.path.split('/')[2]
    return None  # fail?
...