Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python字典与其他条目组合时不起作用_Python 2.7_Dictionary_Mechanize_Stocks - Fatal编程技术网

Python 2.7 Python字典与其他条目组合时不起作用

Python 2.7 Python字典与其他条目组合时不起作用,python-2.7,dictionary,mechanize,stocks,Python 2.7,Dictionary,Mechanize,Stocks,我正在尝试制作一个Python程序,该程序执行以下操作: 给出股票代码列表,在网站www.thestreet.com上列出与每个代码相关联的链接列表,以查找其分析师评级。然后,使用Mechanize导入搜索在网页上对买入、持有或卖出进行评级。返回一本带有键ticker和条目buy、sell或hold的字典 当我一次输入一个股票代码时,代码运行良好,例如Streetdict['AAP']按预期返回['AAP','Buy!']。但是,当与其他标记器分组时,它会提供错误!正如我所定义的那样 代码如下:

我正在尝试制作一个Python程序,该程序执行以下操作: 给出股票代码列表,在网站www.thestreet.com上列出与每个代码相关联的链接列表,以查找其分析师评级。然后,使用Mechanize导入搜索在网页上对买入、持有或卖出进行评级。返回一本带有键ticker和条目buy、sell或hold的字典

当我一次输入一个股票代码时,代码运行良好,例如Streetdict['AAP']按预期返回['AAP','Buy!']。但是,当与其他标记器分组时,它会提供错误!正如我所定义的那样

代码如下:

import mechanize
br = mechanize.Browser()
br.set_handle_robots(False) #ignore
br.addheaders = [("User-agent","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13")]


auto_list = ['AAL','AAP','AN','AZO','BMWYY','BP','CCL','CHH','COP',
             'CVX','DAL','ETP','EXPE','F','FCAU','GM','GPI','GRMN','GT','H','HGV',
             'HLT','HMC','HOG','IHG','ISCA','JBLU','KMX','LAD','LUV','MAR','MGM',
             'NSANY','PBF','PCLN','PII','PK','PSX','RACE','RCL','RYAAY',
             'SHLD','SNI','SZKMY','TM','TRIP','TSLA','TTM','UAL',
             'VAC','VLKAY','VLVLY','WGO','WYN','XOM'] #auto list from stockpile

#bad: BRK/B, 'RDS/A'

#print(auto_list)

link = 'http://www.thestreet.com/quote/???.html' #"The Street" Analyst

def linker(list): #this creates a list of links from the provided tickers
    link_list = []

    for i in list:
        new_l = link.replace('???', i)
        link_list.append(new_l)
    return link_list


#defining the ratings
A = '>(Buy)'
C = '>(Hold)'
F = '>(Sell)'

def TheStreetchecker(list): #this checks the buy or sell rating on the website, "The Street" specifically


    BorS = []
    for i in list:
        br.open(i)
        if A in br.response().read():
            BorS.append("Buy!")
        if C in br.response().read():
            BorS.append("Hold!")
        if F in br.response().read():
            BorS.append("Sell!")

        else:
            BorS.append("Error!")
    return BorS

def Streetdict(list):
    D1 = zip(list, TheStreetchecker(linker(auto_list)))
    print D1
L0 = ['AZO']
Streetdict(L0)
以下是我在不同列表上运行Streetdict后得到的一些回报:

[('AAL', 'Buy!'), ('AAP', 'Error!'), ('AN', 'Buy!'), ('AZO', 'Error!'), ('BMWYY', 'Hold!'), ('BP', 'Error!'), ('CCL', 'Sell!'), ('CHH', 'Error!'), ('COP', 'Hold!'), ('CVX', 'Error!'), ('DAL', 'Buy!'), ('ETP', 'Error!'), ('EXPE', 'Hold!'), ('F', 'Error!'), ('FCAU', 'Hold!'), ('GM', 'Error!'), ('GPI', 'Hold!'), ('GRMN', 'Error!'), ('GT', 'Buy!'), ('H', 'Error!'), ('HGV', 'Hold!'), ('HLT', 'Error!'), ('HMC', 'Buy!'), ('HOG', 'Error!'), ('IHG', 'Hold!'), ('ISCA', 'Error!'), ('JBLU', 'Buy!'), ('KMX', 'Error!'), ('LAD', 'Buy!'), ('LUV', 'Error!'), ('MAR', 'Buy!'), ('MGM', 'Error!'), ('NSANY', 'Buy!'), ('PBF', 'Error!'), ('PCLN', 'Buy!'), ('PII', 'Error!'), ('PK', 'Buy!'), ('PSX', 'Error!'), ('RACE', 'Error!'), ('RCL', 'Buy!'), ('RYAAY', 'Error!'), ('SHLD', 'Buy!'), ('SNI', 'Error!'), ('SZKMY', 'Buy!'), ('TM', 'Error!'), ('TRIP', 'Error!'), ('TSLA', 'Buy!'), ('TTM', 'Error!'), ('UAL', 'Buy!'), ('VAC', 'Error!'), ('VLKAY', 'Buy!'), ('VLVLY', 'Error!'), ('WGO', 'Buy!'), ('WYN', 'Error!'), ('XOM', 'Buy!')]
>>> 
================== RESTART: /home/jadamczk/stock_chooser.py ==================
[('AAP', 'Buy!')]
>>> 
================== RESTART: /home/jadamczk/stock_chooser.py ==================
[('AAP', 'Buy!'), ('AZO', 'Error!')]
>>> 
================== RESTART: /home/jadamczk/stock_chooser.py ==================
[('AZO', 'Buy!')]
在上面代码块的最后两个字典返回中,错误应该很明显

我正在使用Python2.7.12,将最新版本机械化,并在LinuxFedora24上运行这一切


如果您想了解其他信息,请询问

问题出在streetchecker函数的if语句中:

for i in list:
    br.open(i)
    if A in br.response().read(): # When this is true
        BorS.append("Buy!") # append with 'Buy' (1st append)
    if C in br.response().read(): # then check again if this is true which is not
        BorS.append("Hold!")

    # here is the problem
    if F in br.response().read(): # then check again if this is true which is not
        BorS.append("Sell!")
    else: # if F is not in br.response().read() which is true
        BorS.append("Error!") # append again with Error (2nd append)
对于每个循环,当A或C在br.response.read中时,列表将被追加两次,一次加上“买入”或“持有”,另一次加上“错误”。要更正此错误,请使用elif:


就是这样,我希望它是清楚的。

我刚刚注意到字典中每隔一个键都会返回错误!我相信这与整个问题有关。非常感谢!所以else语句总是只链接到它前面的if语句?这帮了大忙,谢谢。
for i in list:
    br.open(i)
    if A in br.response().read():
        BorS.append("Buy!")
    elif C in br.response().read():
        BorS.append("Hold!")
    elif F in br.response().read():
        BorS.append("Sell!")

    else:
        BorS.append("Error!")