Ответ 1
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]
Я знаю, что это можно легко сделать с помощью функций 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
, но что дальше?
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]
Я создал синтаксический анализатор youtube без regexp:
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
Здесь RegExp он охватывает эти случаи
((?<=(v|V)/)|(?<=be/)|(?<=(\?|\&)v=)|(?<=embed/))([\w-]+)
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 = ""
Непроверенные.
Нет необходимости в регулярном выражении. Разделите на ?
, возьмите второй, разделите на =
, возьмите второй, разделите на &
, возьмите первый.
Вот что вы можете попробовать с помощью regex для ID видео youtube:
# regex for the YouTube ID: "^[^v]+v=(.{11}).*"
result = re.match('^[^v]+v=(.{11}).*', url)
print result.group(1)
Я сделал решение Михаила Кашкина 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&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?