Не удалось получить конкретный тег с помощью bs4?

#python #web-scraping #beautifulsoup #python-requests

Вопрос:

Я использую bs4 и Python 3.6 моя проблема заключается в том, что есть на YouTube, страницу поиска и я хочу получить ссылку на первое видео, в нем я нашел после проверки того, что идентификатор, что якорный тег video-title , и я использовал этот параметр, чтобы найти то, что тег, используя следующий код также ссылка на все видео тег привязки имеет тот же идентификатор, video-title поэтому я решил использовать find вместо find_all

 from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests

soup =BeautifulSoup(requests.get('https://www.youtube.com/results?search_query=unravel').text,'lxml')

link = soup.find('a',id="video-title")
print(link)
 

но взамен это дает

 None
 

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

Кто-нибудь может сказать, в чем проблема?

Комментарии:

1. Youtube использует динамический рендеринг данных, что означает, что данные отображаются с помощью JS, а также, если вы распечатаете суп, который вы не сможете найти a tag , поэтому вы можете попробовать использовать selenium api или пакет youtube python

2. @Bhavya можете ли вы рассказать подробнее об этом

Ответ №1:

вы можете использовать это «watch?v=w «, чтобы сделать ваши ссылки проще, чем bs4 ☺

используйте селен с регулярным выражением для достижения наилучших результатов

Комментарии:

1. Можете ли вы объяснить это подробнее

2. он имеет в виду, что приведенное выше регулярное выражение поможет вам отфильтровать все URL-адреса, которые watch?v= в нем содержатся. и, как сказал @bhavya, youtube использует динамический рендеринг данных, поэтому использование selenium или youtube api-ваш лучший вариант, вам придется выбрать, что вы хотите использовать.

Ответ №2:

вы можете попробовать это, если у вас есть selenium и lxml установить в своей среде.

 from selenium import webdriver
from bs4 import BeautifulSoup

def get_tag():
  chrome_options = webdriver.ChromeOptions()
  chrome_options.add_argument('--headless')
  chrome_options.add_argument('--no-sandbox')
  chrome_options.add_argument('--disable-dev-shm-usage')
  driver = webdriver.Chrome('chromedriver',chrome_options=chrome_options)

  driver.get('https://www.youtube.com/results?search_query=unravel')
  # print(driver.page_source)
  soup = BeautifulSoup(driver.page_source, 'lxml')
  atags = soup.find_all('a',{'id':'video-title'})
  for tag in atags:
    print(tag.get('title'))

 

этот метод вернет название <a> тега, у которого есть <video-title> идентификатор.