Использование LXML для возврата текста заголовка - PullRequest
1 голос
/ 24 октября 2019

Я работаю над школьным проектом и использую LXML и его функцию .xpath, чтобы попытаться получить заголовки лучших видео по поиску на YouTube, которые вы можете выбрать. Моя проблема в том, что когда он перебирает топ-5 и возвращает значения заголовков видео, я не могу понять, как вернуть действительный заголовок, независимо от того, что я делаю. Я пытался сделать /text() или /string или /title/text(), так как текст, который я пытаюсь получить, находится в заголовке, но все, что я делаю, просто возвращает пустой список [].

Вот мойкод Python:

from lxml import html
import requests

string = input("Enter what you want to search up on Youtube: \n")
string.replace(" ", "+")
page = requests.get('https://www.youtube.com/results?search_query=' + string)
tree = html.fromstring(page.content)
for x in range(5):
  v = tree.xpath('/html/body/ytd-app/div/ytd-page-manager/ytd-search/div[1]/ytd-two-column-search-results-renderer/div/ytd-section-list-renderer/div[2]/ytd-item-section-renderer/div[3]/ytd-video-renderer[1]/div[1]/div/div[' + str(x) + ']/div/h3/a')
  print(v)

И вот что я получаю:

Enter what you want to search up on Youtube:
rainbow
[]
[]
[]
[]
[]

И это HTML-код того, что я пытаюсь получить TITLE TEXT это из:

<a id="video-title" class="yt-simple-endpoint style-scope ytd-video-renderer" title="Hide and Seek in Rainbow Six Siege... Let's Go!!" href="/watch?v=g8MM_RS7zmw" aria-label="Hide and Seek in Rainbow Six Siege... Let's Go!! by Get_Flanked 8 hours ago 21 minutes 54,654 views">
                Hide and Seek in Rainbow Six Siege... Let's Go!!
              </a>

Я впервые создаю один из них, и я всего лишь студент, поэтому будьте спокойны, если я что-то неправильно отформатировал или сделал что-то не так. Спасибо за помощь !!

1 Ответ

1 голос
/ 24 октября 2019

Рассмотрите возможность использования API данных YouTube, у них есть библиотека Python.

в противном случае, если вы хотите использовать скребоксортировать, вам понадобится тот, который может выполнять Javascript. requests загружает только текстовый файл html, он не запускает javascript.

например, с селеном.

import selenium.webdriver

options = selenium.webdriver.FirefoxOptions()
options.add_argument("--headless")

driver = selenium.webdriver.Firefox(firefox_options=options)

driver.get('https://www.youtube.com/results?search_query=montypython')

[x.text for x in driver.find_elements_by_xpath('//*[@id="video-title"]')]
[x.text for x in driver.find_elements_by_id('video-title')]
print(dir(driver))

# how to get html tag attributes for example href
x.get_attribute("href")

>>> [x.get_attribute('title') for x in driver.find_elements_by_id('video-title')]
['Monty Python And The Holy Grail 1975 HD', 'Monty Python and the Holy Grail', "Monty Python's - The Funniest Joke in the World (la blague qui tue)", 'Argument', 'Monty Python - The Black Knight - Tis But A Scratch', 'Monty Python- Cheese Shop', 'Monty Python: The Parrot Sketch & The Lumberjack Song movie versions HQ', 'Biggus Dickus - Monty Python, Life of Brian.', 'Monty Python - Bridge of Death', 'Life of Brian 1979 (sub indo)', 'John Cleese - How To Irritate People 1968', 'Monty Python and The Holy Grail - Black Knight HD', 'Eric Idle - "Always Look On The Bright Side Of Life" - STEREO HQ', 'Monty pythons, Mr creosote, Full version,', 'Monty Python   Ministry of Silly Walks NL', 'Monty Python - careers advice', 'Monty Python and the Holy Grail - Bunny Attack Scene (HD)', 'Monty Python Society For Putting Things On Top of Other Things', 'Monty Python - Constitutional Peasants Scene (HD)']

см. Также: https://stackoverflow.com/help/how-to-ask и https://stackoverflow.com/tour

Пока ваш вопрос показывает некоторые усилия и ясен, ваши вопросы могут или не могут найти ответв зависимости от того, может ли кто-то еще понять, о чем его спрашивают, и у него есть время ответить.

...