2010-12-04 97 views
18

我知道这是可以使用PHP的parse_urlparse_str功能可以轻松完成:如何从Python的YouTube链接中提取视频ID?

$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但接下来呢?

回答

40

Python有a library for parsing URLs

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] 
2

不需要正则表达式。拆分?,取第二个,拆分=,取第二个,拆分&,取第一个。

+0

工作。你有什么想法,这种方法是否足够防弹,在市场就绪项目中没有更大的担忧? – decarbo 2010-12-05 00:06:50

+6

为此使用urlparse。不要用字符串分割或正则表达式来滚动自己。 http://docs.python.org/library/urlparse.html – 2010-12-05 00:09:41

+0

给人里urlparse查询作为一个整体所以还是我需要拆分它来获取ID – decarbo 2010-12-05 01:38:11

2

下面是一些你可以尝试使用正则表达式的YouTube视频ID:

# regex for the YouTube ID: "^[^v]+v=(.{11}).*" 
result = re.match('^[^v]+v=(.{11}).*', url) 
print result.group(1) 
3
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 = "" 

未经检验。

42

我创建的YouTube ID解析器没有正则表达式:

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 
6

这里是正则表达式它涵盖这些情况enter image description here

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

相关问题