2017-02-09 2 views
1

Я хотел написать что-то, что вернет мне продолжительность видеоролика ссылки на YouTube. Итак, я нашел requests и lxml и начал с руководства this.Неспособность получить длительность видео youtube с помощью xpath

Вот установка:

import requests 
from lxml import html 

url = 'https://www.youtube.com/watch?v=EN8fNb6uhns' 
page = requests.get(url) 
tree = html.fromstring(page.content) 

Тогда я пытаюсь использовать XPath, чтобы получить срок, но он не работает. Попытка получить продолжительность:

tree.xpath('//span[@class="ytp-time-duration"]/text()') 

возвращает пустой список. Но когда я попытаюсь получить название (в качестве теста) с:

tree.xpath('//h1[@class="watch-title-container"]/span/text()') 

это работает. Когда я использую инспектировать скопировать XPath от длительности элемента ничего не возвращается:

tree.xpath('/html/body/div[2]/div[4]/div/div[4]/div[2]/div[2]/div/div[24]/div[2]/div[1]/div/span[3]') 

Когда я сделать то же самое за титул он снова работает.

Что происходит?

+0

Одно решение для вашей проблемы может быть обезглавленный браузер или WebKit, как PhantomJS - который может выполнить JS. –

ответ

1
span[@class="ytp-time-duration"] 

этот span тег генерируется JavaScript, и он не будет возвращен на requests, requests просто возвращает HTML код

0

для YouTube Xpath не была последовательной. я получил два разных XPaths (это 2 XPaths я получил для захвата видео Продолжительность)

//*[@id='movie_player']/div[5]/div/div/div[5]/button/div[1] 

//*[@id="movie_player"]/div[26]/div[2]/div[1]/div/span[3] 

Пробовал вариант нахождения элемента по имени класса

FindElement(By.ClassName("ytp-time-duration")) 

Это работало всегда.

string VideoDuration = firfxdrivr.FindElement(By.ClassName("ytp-time-duration")).GetAttribute("textContent"); 

Console.WriteLine(VideoDuration); 

Выход: 19:18

Смежные вопросы