2016-08-01 49 views
-2

我試圖從雅虎財務使用urllib2拉動信息,然後使用分割函數來顯示淨收入。當我在Python 2.7.12 shell中運行程序時,必須在單引號中打印帶有股票代碼的命令「yahooNetIncome('')」。每當我這樣做,它會出現錯誤「主循環列表索引超出範圍失敗」。我相當新的python,所以我不完全理解這個問題。如果有人可以請幫助,將不勝感激。Python錯誤'列表索引超出範圍'使用分割函數時

import time 
import urllib2 
from urllib2 import urlopen 

stock = ['a', 'aa', 'aapl', 'abbv', 'abc', 'abt', 'ace', 'aci', 'acn', 'act', 'adbe', 'adi', 'adm', 'adp'] 

def yahooNetIncome(stock): 
    try: 
     sourceCode = urllib2.urlopen('https://finance.yahoo.com/quote/' + stock + '/financials').read() 
     NI = sourceCode.split('<span data-reactid=".1vqhh4ora92.1.$0.0.0.3.1.$main-0-Quote-Proxy.$main-0-Quote.0.2.0.2:1:$INCOME_STATEMENT.0.0.$GROSS_PROFIT.1:$0.0.0">')[1].split('</span>')[0] 
     print 'Net Income: ', NI 
    except Exception, e: 
     print 'failed in main loop', str(e) 
+1

第一個split命令返回長度<2的列表,或者第二個返回空列表。您應該使用像BeautifulSoup這樣的專用HTML解析器,而不是嘗試在現在正在使用的HTML元素上使用動態分割功能。 – James

回答

0

你的列表索引超出範圍意味着您的split()方法調用沒有發現任何分裂上。因此,不會有索引1(不分割,只有一個索引),導致列表索引超出範圍錯誤被拋出。

+0

你能告訴我正確的代碼嗎? –

+0

@ R.Orford要做到這一點,我必須梳理頁面的HTML代碼,我不打算爲你做。 – intboolstring

1

你會被一些事情困擾。

您遇到的超出範圍的錯誤是由於列表中沒有任何內容顯示您嘗試獲取NI賦值行中的第零個元素。該列表爲空,因爲split()調用失敗,並且失敗,因爲從URL中提取的數據中不存在您要輸入的字符串。這是一個小問題。

你可能想知道爲什麼那個字符串不在那裏,你可以用瀏覽器檢查器清楚地看到它。以下是您遇到的更大問題:您正在下載的頁面動態地通過JavaScript更改其內容。如果您使用像Curl這樣的工具直接將其轉儲到磁盤而不執行JavaScript,則會看到您搜索的字符串不存在於該文件中。更糟糕的是,你想要獲取的字符串(你想分配的數字NI)也不存在。 JavaScript必須在顯示之前運行。在您的瀏覽器中,您已經看到了JavaScript運行後的實時顯示。當您通過Python(或Curl或其他任何不像瀏覽器行爲的工具,並按照頁面期望的方式運行JavaScript)的頁面拉動頁面時,您將無法獲得所需的數據。

很可能這是由網站所有者專門阻止你想要做的事情。

+0

代碼你告訴我代碼應該看起來像什麼,或者是我試圖完成不可能的事情? –

+0

@ R.Orford沒有簡單的答案。您必須模仿瀏覽器的操作,或者自動瀏覽器轉到頁面並轉儲呈現的版本。如果你偏離常規瀏覽器太遠,你正在尋找的數字將不會在那裏。 – Feneric

+0

好的,謝謝你的時間。 –