我有这个代码块,它应该在提供股票代码时给出CIK号码:
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。
答案 0 :(得分: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)
因为您在list()
上使用了root.iter()
,所以整个表达式不会引发StopIteration
(list()
捕捉到这一点)。相反,表达式可能会提升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)