2014-07-04 36 views
-4

我有這樣的代碼塊,它應該給出來的時候,股票代碼提供了CIK號碼:輸入字符串參數作爲功能可變給人一種NameError

def lookup_cik(ticker, name=None): 
    good_read = False 
    ticker = ticker.strip().upper() 
    url = 'http://www.sec.gov/cgi-bin/browse-edgar?action+getcompany&CIK=(cik)&count=10&output=xml'.format(cik=ticker) 

    try: 
     xmlFile = urlopen (url) 
     try: 
      xmlData = xmlFile.read() 
      good_read = True 
     finally: 
      xmlFile.close() 
    except HTTPError as e: 
     print("HTTP Error:", e.code) 
    except URLError as e: 
     print("URL Error:", e.reason) 
    except TimeoutError as e: 
     print("Timeout Error:", e.reason) 
    except socket.timeout: 
     print("Socket Timeout Error") 
    if not good_read: 
     print("Unable to lookup CIK for ticker:", ticker) 
     return 
    try: 
     root = ET.fromstring(xmlData) 
    except ET.ParseError as perr: 
     print("XML Parser Error:", perr) 

    try: 
     cikElement = list(root.iter("CIK"))[0] 
     return int(cikElement.text) 
    except StopIteration: 
     pass 

然而,當它試圖輸入一個股票股票我得到

>>> lookup_cik(BDX) 
Traceback (most recent call last): 
    File "<pyshell#34>", line 1, in <module> 
    lookup_cik(BDX) 
NameError: name 'BDX' is not defined 

我知道這是一個NameError,但我從來沒有見過其中函數不承認所謂輸入的參數數據的股票代碼在我們的例子是BDX一個問題。

+1

如何定義BDX?你沒有引用它。 – octopusgrabbus

回答

4

你的函數需要,所以在一傳:

lookup_cik("BDX") 

不帶引號Python解析,作爲,但你永遠不綁定任何該名稱(分配給它)。

請注意,如果出現分析錯誤,您還將得到一個UnboundLocalError: local variable 'root' referenced before assignment異常。你可能想在這一點上退出功能:

try: 
    root = ET.fromstring(xmlData) 
except ET.ParseError as perr: 
    print("XML Parser Error:", perr) 
    return 

你很可能得到一個解析錯誤,因爲你從來沒有真正的字符串中的任何插值股票;你缺少一個{cik}佔位符:

url = 'http://www.sec.gov/cgi-bin/browse-edgar?action+getcompany&CIK=(cik)&count=10&output=xml'.format(cik=ticker) 

你可能想用的CIK={cik}那裏。快速實驗直接調用現場還展示了你需要使用action=getcompany=而不是+):

url = 'http://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK={cik}&count=10&output=xml'.format(cik=ticker) 

由於您使用root.iter()list(),整個表達式不會提高StopIterationlist()漁獲量這一點)。相反,表達式可以改爲IndexError而不是

我會使用next()有代替:

cikElement = next(root.iter("CIK"), None) 
return cikElement and int(cikElement.text) 

或者更好的是,只要使用Element.find()

cikElement = root.find("CIK") 
return cikElement and int(cikElement.text) 
+0

哦,恥辱我!哦,無論如何,這個問題可能會幫助別人,我認爲我們應該保持它 – ExoticBirdsMerchant

+0

良好的捕獲額外的錯誤。 – octopusgrabbus

+0

非常感謝。你不僅回答了你走到敵後的問題! – ExoticBirdsMerchant

相關問題