2016-12-01 2 views
0

Hier ist mein aktueller Code. Ich bin mir nicht sicher, was ich falsch mache. Vielleicht graben wir nicht tief genug im HTML und geben Beautifulsoup die richtigen Tags? Im Moment gibt mein Code mir Leerzeichen zurück.Wie Web-Schrott youtube Transkripte mit Beautifulsoup4 und Python 3

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()) 

Hier ist der Code, den ich inspiziert habe. Ich versuche, Python zu bekommen, um mich, um wieder zurück „aber es war untucked“

<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> 

*** bearbeiten

Der Code kann durch einen Klick auf „mehr“ neben der Share-Taste zu finden. Dann klicken Sie auf Transkripte und Sie werden den ganzen Text dort sehen.

+0

Ich kann diese Zeile auf der Seite und in den HTML-Code finden. Was ist diese Linie? –

+0

Sind Sie sicher, dass dies nicht dynamisch über Ajax geladen wird? Öffnen Sie die Seitenquelle, da in der statischen Quelle möglicherweise kein solches Element vorhanden ist. –

+0

@Yevhen Kuzmovych Wenn Sie auf die Youtube-Seite gehen, gibt es eine Schaltfläche "mehr" neben zu teilen. Klicken Sie darauf und dann auf Abschriften. Es ist Linie 0:07. –

Antwort

0

Oh ja, es ist über Ajax geladen: Öffnen Sie die Seite, dann öffnen Sie Network Registerkarte, sortieren Anfragen nach Startzeit (neueste Anfragen zuerst), klicken Sie auf CC-Taste auf Youtube.

Sie erhalten api/timedtext Anfrage, die Antwort ist ein XML. Hier finden Sie die vollständige URL an das Transkript:

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

Ich habe keine Ahnung, wie diese URL generiert wird, though. Dies erfordert die Untersuchung von komplexen YouTube-Skripts, etc.

EDIT: hat mir geholfen. Sie können die meisten dieser Parameter weglassen und nur diese URL:

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

Oder diese im Allgemeinen:

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

Bedeutet dies, dass das Transkript nur durch eine andere URL gescratet werden kann? Und kann nicht direkt von der Seite gekratzt werden? –

+0

@BHok Ja, Sie benötigen eine andere URL. Sie müssen den '{video_id}' 'Teil Ihrer alten URL extrahieren, zum Beispiel mit [dieser Regex] (https://regex101.com/r/RuGXmI/2): 'v = (? P [a- zA-Z \ d _] +) '. Oder parsen Sie die URL mit einer Bibliothek und holen Sie sich den 'v'-Parameter, das ist eine mühsame Aufgabe. Und dann in die neue, wenn Sie dies automatisch tun müssen. –

+0

@BHok Wenn diese Antwort Ihr Problem löst, betrachten Sie [als akzeptiert] (http://stackoverflow.com/help/accepted-answer) (grüner Haken). –

Verwandte Themen