#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 python2. @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>
идентификатор.