我试图在python中写下一个函数来检索索引的组件列表。 所以我想说看看FTSE100(^ FTSE),我想得到它的所有组件(100个)或更多信息。
只需添加标记即可获得有关组件的更多信息(请参阅this)。
但是,根据索引,我只能检索前51个组件(第一页:http://finance.yahoo.com/q/cp?s=%5EFTSE&c=0)。
我的功能是:
at = '%40'
def getListComponents(symbol):
url = 'http://finance.yahoo.com/d/quotes.csv?s=%s%s&c=1&f=s' % (at, symbol)
return urllib.urlopen(url).read().strip().strip('"')
Output example:
'AAL.L"\r\n"ABF.L"\r\n"ADM.L"\r\n"ADN.L"\r\n"AGK.L"\r\n"AMEC.L"\r\n"ANTO.L"\r\n"ARM.L"\r\n"AV.L"\r\n"AZN.L"\r\n"BA.L"\r\n"BAB.L"\r\n"BARC.L"\r\n"BATS.L"\r\n"BG.L"\r\n"BLND.L"\r\n"BLT.L"\r\n"BNZL.L"\r\n"BP.L"\r\n"BRBY.L"\r\n"BSY.L"\r\n"BT-A.L"\r\n"CCL.L"\r\n"CNA.L"\r\n"CPG.L"\r\n"CPI.L"\r\n"CRDA.L"\r\n"CRH.L"\r\n"CSCG.L"\r\n"DGE.L"\r\n"ENRC.L"\r\n"EVR.L"\r\n"EXPN.L"\r\n"FRES.L"\r\n"GFS.L"\r\n"GKN.L"\r\n"GLEN.L"\r\n"GSK.L"\r\n"HL.L"\r\n"HMSO.L"\r\n"HSBA.L"\r\n"IAG.L"\r\n"IHG.L"\r\n"IMI.L"\r\n"IMT.L"\r\n"ITRK.L"\r\n"ITV.L"\r\n"JMAT.L"\r\n"KAZ.L"\r\n"KGF.L"\r\n"LAND.L'
这样解析组件标题非常容易。
如何获得49个重组组件? 请注意,在我查看FTSE250或更高版本的情况下,未检索到的组件可能会更多。
没有答案:
所以我做了一些研究,尝试了许多旗帜组合,找到并阅读了这个评论帖:code.google.com/p/yahoo-finance-managed/wiki/csvQuotesDownload;我得出结论,不可能将索引的所有组件下载为CSV。
如果您遇到同样的问题而不仅仅是使用BeautifulSoup。你可能不喜欢这种方法,但没有其他办法。
答案 0 :(得分:5)
如果您这样做,表格顶部会显示last
的一个小链接 - 它会为您提供最后一页编号 - http://finance.yahoo.com/q/cp?s=%5EFTSE&c=2
(来自您的示例)然后将其拆分以创建范围range(number)
以循环并请求类似于您当前正在执行的操作的页面。
另一方面,我非常肯定雅虎!必须有一些API吗?
答案 1 :(得分:1)
我是Python新手并找到了我的脚。
我一直在寻找解决同样问题的方法,但最终还是写了自己的问题。我的代码是低效,冗长和丑陋的 - 但是它很有用,如果很少,我会使用它。我期待着向更聪明的人学习。
def getIndexComponents(symbol):
# function to retrieve the component list of equity index
# from Yahoo Finance, if available
import requests
p = 0
while p < 12:
if p == 0:
url = 'http://finance.yahoo.com/q/cp?s=%5E' + symbol
text = requests.get(url).content
# </a></b></td><td
componentSubset = [text[n-10:n] for n in xrange(len(text)) if text.find('</a></b></td><td', n) == n]
for comp in range(len(componentSubset)):
componentSubset[comp] = componentSubset[comp][(1+componentSubset[comp].index('>')):]
components = componentSubset
else:
url = 'http://finance.yahoo.com/q/cp?s=%5E' + symbol + '&c=' + str(p)
text = requests.get(url).content
componentSubset = [text[n-10:n] for n in xrange(len(text)) if text.find('</a></b></td><td', n) == n]
for comp in range(len(componentSubset)):
componentSubset[comp] = componentSubset[comp][(1+componentSubset[comp].index('>')):]
components.extend(componentSubset)
p = p + 1
components = set(components)
return components
getIndexComponents( '富')