Я знаю, что это легко сделать с помощью функций PHP parse_url и parse_str:
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, но что дальше?
urlparse
Я создал анализатор идентификаторов 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
В 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]
Здесь 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 = ""
Непроверенные.
Вот кое-что, что вы можете попробовать использовать регулярное выражение для идентификатора видео 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?