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>