如何从YouTube';Python中的链接?

如何从YouTube';Python中的链接?,python,regex,parsing,url-parsing,Python,Regex,Parsing,Url Parsing,我知道使用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但是下一步怎么办?不需要正则表达式。在上拆分?,拿第二个,

我知道使用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
但是下一步怎么办?

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


您可以尝试使用regex作为youtube视频ID:

# regex for the YouTube ID: "^[^v]+v=(.{11}).*"
result = re.match('^[^v]+v=(.{11}).*', url)
print result.group(1)

未测试。

我创建了不带regexp的youtube id解析器:

导入URL解析 def视频_id(值): """ 示例: - 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.urlparse(值) 如果query.hostname==“youtu.be”: 返回查询。路径[1:] 如果query.hostname位于('www.youtube.com','youtube.com'): 如果query.path='/watch': p=urlparse.parse_qs(query.query) 返回p['v'][0] 如果query.path[:7]='/embed/': 返回query.path.split('/')[2] 如果query.path[:3]='/v/': 返回query.path.split('/')[2] #失败? 一无所获
这里是RegExp,它涵盖了这些情况


((?这是Mikhail Kashkin解决方案的Python3版本,添加了场景

从urllib.parse导入urlparse,parse
#无检查PyTypeChecker
def提取视频id(url):
#示例:
# - 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(url)
如果query.hostname=='youtu.be':返回query.path[1:]
如果query.hostname位于{'www.youtube.com','youtube.com'}:
如果query.path='/watch':返回parseqs(query.query)['v'][0]
如果query.path[:7]='/watch/':返回query.path.split('/')[1]
如果query.path[:7]='/embed/':返回query.path.split('/')[2]
如果query.path[:3]='/v/':返回query.path.split('/')[2]
#以下是播放列表的可选选项
如果query.path[:9]='/playlist':返回parse_qs(query.query)['list'][0]
#对于无效的YouTube url,返回None

虽然这将进行搜索查询,但会为您提供
id

from youtube_search import YoutubeSearch    
results = YoutubeSearch('search terms', max_results=10).to_json()    
print(results)
你可以用

from urllib.parse import urlparse

url_data = urlparse("https://www.youtube.com/watch?v=RG9TMn1FJzc")
print(url_data.query[2::])
url=”http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1"
已解析=url.split(“?”)
videoId=已解析[1]
打印(视频ID)
这将适用于所有类型的YouTube视频链接。

我使用这个很棒的软件包。
$pip安装pytube

#示例
url1=http://youtu.be/SA2iWivDJiE'
url2=http://www.youtube.com/watch?v=_oPAwA_Udwc&feature=feedu'
url3=http://www.youtube.com/embed/SA2iWivDJiE'
url4=http://www.youtube.com/v/SA2iWivDJiE?version=3&;hl=en_US'
url5=https://www.youtube.com/watch?v=rTHlyTphWP0&index=6&list=PLjeDyYvG6-40qawYNR4juzvSOg-ezZ2a6'
url6='youtube.com/watch?v=\u lOT2p\u FCvA'
url7='youtu.be/watch?v=\u lOT2p\u FCvA'
url8=https://www.youtube.com/watch?time_continue=9&v=n0g-Y0oo5Qs&feature=emb_标志'
URL=[url1、url2、url3、url4、url5、url6、url7、url8]
#获取youtube id
从pytube进口提取物
对于url中的url:
id=提取.视频\u id(url)
打印(id)
输出

SA2iWivDJiE
_奥帕瓦乌德沃克
SA2iWivDJiE
SA2iWivDJiE
RTHYTPHWP0
_lOT2p_FCvA
_lOT2p_FCvA
n0g-Y0oo5Qs

work。你知道这种方法是否足够可靠,可以在市场准备好的项目中使用而不用担心更大的问题吗?使用URLPRASE。不要使用字符串拆分或正则表达式。URLPRASE作为一个整体提供查询,所以我仍然需要将其拆分以获得ID
我可以执行URLPRASE,但下一步怎么办?
是的,我知道,但问题是与查询部分一起使用。@decarbo更新后的答案显示如何仅提取查询字符串中
v
参数的值。yap,我想这是最好的解决方案。仅供参考,在提交
youtube.com/watch?v=hP54ne1COvY
时,这将不起作用,因为它缺少http请注意
urlparse
已移动到
urlPython3中的lib.parse
类似于这一点的东西可以做到:
将urllib.parse导入为urlparse
这一个非常适合解析所有可能的youtube链接格式。您可以使用
query.path.startswith('/embed/'))
增加易读性。除了一个场景外,上述解决方案运行良好。如果我也能为上述场景找到解决方案,那将非常有用。“我会完成您开始的工作”;)::为了在python中实现这一点,我还必须更正语法:
(?
/((?这个答案是2010年的,但是正则表达式也可以修改以匹配这个模式。
be[/](.{11})。*
from youtube_search import YoutubeSearch    
results = YoutubeSearch('search terms', max_results=10).to_json()    
print(results)
from urllib.parse import urlparse

url_data = urlparse("https://www.youtube.com/watch?v=RG9TMn1FJzc")
print(url_data.query[2::])