2013-08-22 66 views
1

我想加載一個YouTube頁面,並獲取<embed>元素,如下所示。但是,無法找到嵌入元素(soup.find('embed')返回None)。模擬瀏覽器訪問加載所有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') 

然而,當我寫的湯到HTML文件,然後在瀏覽器中加載它加載<embed>元素。據推測這與瀏覽器不同於機械化和某種魔法有關?

如何模擬瀏覽器加載頁面以便我可以看到<embed>元素?

+0

SELENIUM!這是你的答案 –

回答

1

該頁面使用js以動態方式加載內容。機械化根本無法處理它。你這裏有兩種選擇:

  • 儘量模擬那些JS手動調用腳本
  • 是一個使用selenium同一樣品切換到瀏覽器的工具,如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 

希望有幫助。

+1

尼斯視頻,btw :) – alecxe

+0

這是一個很好的選擇,但我寧願不使用真正的瀏覽器! –

+0

@david_adler好吧,可能是一個無頭瀏覽器是一個選項,請參閱http://stackoverflow.com/questions/6025082/headless-browser-for-python-javascript-support-required – alecxe