-1

我正在尝试在 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。您可能不喜欢这种方法,但没有其他方法。

解决我的大部分问题

4

2 回答 2

5

如果你这样做,表格顶部有一个小链接,上面写着last- 它会给你最后的页码 - http://finance.yahoo.com/q/cp?s=%5EFTSE&c=2(来自你的例子)然后将其拆分以创建一个range(number)循环和请求的范围页面类似于您目前的情况。

  1. 打开初始页面
  2. 通过 lxml.html 或 BeautifulSoup 提取链接
  3. 解析出最后的页码
  4. 循环检索每个页面的数量

顺便说一句,我很确定雅虎!必须有一些API?

于 2012-11-16T17:23:50.757 回答
1

我是 Python 新手,正在寻找自己的脚。

我一直在寻找相同问题的解决方案,但最终写了自己的。我的代码效率低下、冗长且丑陋 - 但它有效,如果很少使用,我会使用。我期待向更聪明的人学习。

def getIndexComponents(符号):

# 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('FTSE')

于 2016-01-04T14:47:37.033 回答