J'essaie d'obtenir le href de la balise d'ancrage de la toute première recherche vidéo sur youtube en utilisant une belle soupe. Je le recherche en utilisant le "a" et la classe _ = "yt-simple-endpoint style-scope ytd-video-renderer". Mais je n'obtiens aucun.
Veuillez aider. :)
from bs4 import BeautifulSoup
import requests
source = requests.get("https://www.youtube.com/results?search_query=MP+election+results+2018%3A+BJP+minister+blames+conspiracy+as+reason+while+losing").text
soup = BeautifulSoup(source,'lxml')
# print(soup2.prettify())
a =soup.findAll("a", class_="yt-simple-endpoint style-scope ytd-video-renderer")
a_fin = soup.find("a", class_="compact-media-item-image")
#
print(a)
5 Réponses :
La classe que vous recherchez n'existe pas dans le HTML mis au rebut. Vous pouvez l'identifier en imprimant la variable soupe. Par exemple,
[<a class="sign-in-link" href="https://accounts.google.com/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26feature%3Dplaylist%26hl%3Den%26next%3D%252Fresults%253Fsearch_query%253DMP%252Belection%252Bresults%252B2018%25253A%252BBJP%252Bminister%252Bblames%252Bconspiracy%252Bas%252Breason%252Bwhile%252Blosing&uilel=3&hl=en&service=youtube">Sign in</a>]
donne la sortie sous la forme,
a =soup.findAll("a", class_="sign-in-link")
from bs4 import BeautifulSoup
import requests
source = requests.get("https://www.youtube.com/results?search_query=MP+election+results+2018%3A+BJP+minister+blames+conspiracy+as+reason+while+losing").text
soup = BeautifulSoup(source,'lxml')
first_serach_result_link = soup.findAll('a',attrs={'class':'yt-uix-tile-link'})[0]['href']
heavily inspired by
this answer
Une autre option consiste à effectuer d'abord le rendu de la page avec Selenium.
/watch?v=Jor09n2IF44 /watch?v=ym14AyqJDTg /watch?v=g-2V1XJL0kg /watch?v=eeVYaDLC5ik /watch?v=StI92Bic3UI /watch?v=2W_4LIAhbdQ /watch?v=PH1WZPT5IKw /watch?v=Au2EH3GsM7k /watch?v=q-j1HEnDn7w /watch?v=Usjg7IuUhvU /watch?v=YizmwHibomQ /watch?v=i2q6Fm0E3VE /watch?v=OXNAMyEvcH4 /watch?v=vdcBtAeZsCk /watch?v=E4v2StDdYqs /watch?v=x7kCuRB0f7E /watch?v=KERtHNoZrF0 /watch?v=TenbA4wWIJA /watch?v=Ey9HfjUyUvY /watch?v=hqsuOT0URJU
Sortie:
import bs4
from selenium import webdriver
url = 'https://www.youtube.com/results?search_query=MP+election+results+2018%3A+BJP+minister+blames+conspiracy+as+reason+while+losing'
browser = webdriver.Chrome('C:\chromedriver_win32\chromedriver.exe')
browser.get(url)
source = browser.page_source
soup = bs4.BeautifulSoup(source,'html.parser')
hrefs = soup.find_all("a", class_="yt-simple-endpoint style-scope ytd-video-renderer")
for a in hrefs:
print (a['href'])
En HTML dynamique, vous pouvez utiliser Selenium ou pour obtenir du HTML statique, utilisez l'agent utilisateur GoogleBot
headers = {'User-Agent' : 'Googlebot/2.1 (+http://www.google.com/bot.html)'}
source = requests.get("https://.......", headers=headers).text
soup = BeautifulSoup(source, 'lxml')
links = soup.findAll("a", class_="yt-uix-tile-link")
for link in links:
print(link['href'])
Essayez de parcourir les correspondances:
import urllib2
data = urllib2.urlopen("some_url")
html_data = data.read()
soup = BeautifulSoup(html_data)
for a in soup.findAll('a',href=True):
print a['href']
Double possible de BeautifulSoup obtenant href
il n'y a pas de
class = "yt-simple-endpoint style-scope ytd-video-renderer"dans la source html que vous obtenez derequests.get (). C'est pourquoi tu n'as aucunDouble possible de récupérer des liens de la page Web en utilisant python et BeautifulSoup a>