2016-12-01 40 views
0

这是我目前的代码。我不确定我做错了什么。也许我没有深入挖掘HTML,并给Beautifulsoup正确的标签?目前,我的代码正在返回空白。如何使用Beautifulsoup4和Python 3在网页上截留YouTube成绩单

from bs4 import BeautifulSoup 
from urllib.request import urlopen 
html = urlopen("https://www.youtube.com/watch?v=5_zrHZdhaBU") 
soup = BeautifulSoup(html,'html.parser') 
nameList = soup.findAll("div", {"id": "cp-2"}) 
for name in nameList: 
    print(name.get_text()) 

这是我检查的代码。我试图让Python回来还给我“但它是本来没皱”

<div id="cp-2" class="caption-line" data-time="7.54"><div class="caption-line-time">0:07</div><div class="caption-line-text">but it was untucked.</div></div> 

***编辑

的代码可以通过点击“更多”旁边的分享按钮中找到。然后你点击成绩单,你会看到所有的文字。

+0

我无法找到该网页上,并在html这一行。这条线是什么? –

+0

你确定这没有通过ajax动态加载?打开页面源,静态源中可能没有这样的元素。 –

+0

@Yevhen Kuzmovych 如果您转到YouTube页面,共享旁边会出现一个“更多”按钮。点击它,然后点击成绩单。它是行0:07。 –

回答

0

哦,是的,它通过Ajax加载:打开页面,然后打开Network选项卡,按开始时间对请求进行排序(最先请求第一个),点击Youtube上的CC按钮。

你得到api/timedtext请求,响应是一个XML。 这完整的URL成绩单:

https://www.youtube.com/api/timedtext?signature=1A03D323CBD455E9993B7AC447CA64764FA6FE75.59F4BD2D45A32E89FBF54B418EE2F763283A1007&asr_langs=fr%2Cja%2Cnl%2Ces%2Cru%2Cko%2Cit%2Cde%2Cpt%2Cen&key=yttt1&caps=asr&v=5_zrHZdhaBU&hl=en_US&expire=1480702409&sparams=asr_langs%2Ccaps%2Cv%2Cexpire&lang=en&fmt=srv3

我不知道该URL是如何产生的,虽然。这需要复杂的YouTube脚本的实物指标调查等

编辑:This answer帮助了我。你可以忽略大部分这些参数,只是使用这个网址:

https://www.youtube.com/api/timedtext?&v=5_zrHZdhaBU&lang=en 

还是这一般:

https://www.youtube.com/api/timedtext?&v={video_id}&lang={language_code} 
+0

这是否意味着只能通过转到另一个网址来抄袭抄本?并不能直接从页面上刮掉? –

+0

@BHok是的,你需要一个不同的网址。例如,您需要使用[this regex](https://regex101.com/r/RuGXmI/2)提取旧网址的{{video_id}'部分:'v =(?P [a- ZA-Z \ d _] +)'。或者用一些库解析url并获得'v'参数,这是一项乏味的任务。然后放入新的,如果你需要这个自动完成。 –

+0

@BHok如果此答案解决了您的问题,请考虑[将其标记为已接受](http://stackoverflow.com/help/accepted-answer)(绿色检查)。 –

相关问题