2010-12-04 130 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-]+)

相關問題