2013-08-22 1 views
1

J'essaie de charger une page youtube et obtenir l'élément <embed> comme suit. Toutefois, l'élément embed ne peut pas être trouvé (soup.find('embed') renvoie None).Simuler l'accès au navigateur pour charger tous les éléments html

import urllib 
import urllib2 
from bs4 import BeautifulSoup 
import mechanize 

YT_URL = 'http://www.youtube.com/watch' 
vidId = 'OuSdU8tbcHY' 

br = mechanize.Browser() 
# Browser options 
br.set_handle_equiv(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 
# Follows refresh 0 but not hangs on refresh > 0 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 
# User-Agent (this is cheating, ok?) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
br.open('%s?v=%s' % (YT_URL, vidId)) 
soup = BeautifulSoup(br.response().read()) 
print soup.find('embed') 

Cependant, quand j'écris la soupe à un fichier html et le charger dans un navigateur, il charge l'élément <embed>. Vraisemblablement ceci a quelque chose à faire avec le navigateur étant différent pour mécaniser et une sorte de magie?

Comment puis-je simuler le chargement de la page par le navigateur afin que je puisse voir l'élément <embed>?

+0

SÉLÉNIUM! IL EST VOTRE RÉPONSE –

Répondre

1

La page utilise js pour charger le contenu de manière dynamique. Mécaniser ne peut tout simplement pas le gérer. Vous avez deux options:

  • essayer de simuler ces js appels manuellement dans le script
  • commutateur à outils navigateur comme selenium

Voici le même échantillon en utilisant selenium:

import selenium.webdriver as webdriver 

url = "http://www.youtube.com/watch?v=OuSdU8tbcHY" 

driver = webdriver.Firefox() 
driver.get(url) 

embed = driver.find_elements_by_tag_name('embed')[0] 

print embed 

Espérons que cela aide.

+1

Belle vidéo, btw :) – alecxe

+0

Ceci est une bonne alternative, mais je préfère ne pas utiliser un navigateur réel! –

+0

@david_adler bien, peut être un navigateur sans tête est une option, voir http://stackoverflow.com/questions/6025082/headless-browser-for-python-javascript-support-required – alecxe

Questions connexes