Очистить экземпляр подтвержденного значка Youtube с помощью Beautiful Soup? - PullRequest
0 голосов
/ 06 августа 2020

Я пытался проверить по ссылке на видео на YouTube, что канал / загрузчик подтвержден (синий значок). Похоже, что у Youtube API для этого нет функции, поэтому я пытался очистить, используя BeautifulSoup. Вот что я пробовал:

from bs4 import BeautifulSoup
import requests

url = "https://www.youtube.com/watch?v=" + video_id
source = requests.get(url).text
bs = BeautifulSoup(source, 'lxml')
    
# does not work
bs.find_all("div", {"class": "badge badge-style-type-verified style-scope ytd-badge-supported-renderer"})

Я попытался отследить иерархию элементов HTML, ведущих к классу ytd-badge, и обнаружил это, проверив:

html - > body -> ytd-app -> #content -> # page-manager -> ytd-watch-flexy -> #columns -> #primary -> div # primary-inner.style-scope.ytd-watch-flexy - > #meta -> # meta-content -> ytd-video-secondary-info-renderer.style-scope.ytd-watch-flexy -> #container -> div. # top-row.style-scope.ytd-video -secondary-info-renderer -> ytd-video-owner-renderer -> div. # upload-info.style-scope.ytd-video-owner-renderer -> # имя-канала -> ytd-badge-supported-renderer .style-scope.ytd-channel-name

Он довольно длинный и безумный, поэтому мне было интересно, как я могу получить к нему доступ? Есть ли более простой способ выполнить sh это с помощью Python? Спасибо!

1 Ответ

1 голос
/ 07 августа 2020

YouTube использует JavaScript, поэтому используйте Requests- HTML для очистки страницы.

Установите его, используя pip install requests-html.

Так как существует несколько видео на веб-странице, которые могут иметь значок, нам нужно проверить, существует ли класс, содержащий значок (badge badge-style-type-verified style-scope ytd-badge-supported-renderer), в классе информации канала (style-scope ytd-video-owner-renderer).

from requests_html import HTMLSession
from bs4 import BeautifulSoup

video_id = ""
video_url = "https://www.youtube.com/watch?v=" + video_id
# Initialize an HTML Session
session = HTMLSession()
# Get the html content
response = session.get(video_url)
# Execute JavaScript
response.html.render(sleep=3)

soup = BeautifulSoup(response.html.html, "lxml")

# Find the channel info class
channel_info = soup.select_one('.style-scope ytd-video-owner-renderer')

# Check if the class that contains the verified badge exists in the channel info class
if channel_info.find('div', class_='badge badge-style-type-verified style-scope ytd-badge-supported-renderer'):
    print('Verified')
else:
    print('NOT verified!')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...