Web HTML de raspado usando Python

Creo que estoy muy cerca, por lo que cualquier ayuda sería apreciada. Intentando eliminar los datos de índice y valor de la tabla titulada “Actividad del mercado de valores” en la página de inicio de NASDAQ:

def get_index_prices(NASDAQ_URL): html = urlopen(NASDAQ_URL).read() soup = BeautifulSoup(html, "lxml") for row in soup('table', {'class': 'genTable thin'})[0].tbody('tr'): tds = row('td') print "Index: %s, Value: %s" % (tds[0].text, tds[1].text) print get_index_prices('http://www.nasdaq.com/') 

El error lee:

índice de lista fuera de rango

Esta tabla representa por javascript. Si observa el código fuente de la página, antes de ejecutar javascript, puede ver esta tabla como:

 
Index Value Change Net / %

Puedes usar selenium para raspar. Selenium puede ejecutar javascript.

Iría para el selenium como abajo

 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0 from selenium.webdriver.common.by import By driver = webdriver.Firefox() def get_index_prices(NASDAQ_URL): driver.get(NASDAQ_URL) WebDriverWait(driver,1000).until(EC.presence_of_all_elements_located((By.XPATH,"//table [@id='indexTable']"))) table = driver.find_element_by_xpath("//table [@id='indexTable']") for td in table.find_elements_by_tag_name('tr')[1:]: company = td.find_element_by_xpath(".//following::*[2]") value = td.find_element_by_xpath(".//following::*[3]") print "Index {0:<30} Value {1} ".format(company.text.encode('utf-8'),value.text.encode('utf-8')) driver.quit() get_index_prices('http://www.nasdaq.com/') 

Se imprime

 Index NASDAQ Value 5053.75 Index NASDAQ-100 (NDX) Value 4648.83 Index Pre-Market (NDX) Value 4675.49 Index After Hours (NDX) Value 4647.33 Index DJIA Value 17663.54 Index S&P 500 Value 2079.36 Index Russell 2000 Value 1161.86